プチコンだけではなくプログラミングに使う言語の場合、
乱数というのを使います。
以前も少し説明しましたが、一般的な話も含め改めて解説しておきます。
まず、乱数は続いた一連の数値を順番に返すわけでなく
でたらめな値を返します。
けど、これは少し説明が必要ですし、プログラムする際に気をつけないといけません。
まず、数学的にいう乱数とは、でたらめな値を作って返すわけですが。。。
ここには次のようなパターンが存在します。
1)一様な乱数
この一様な乱数とは数学的な乱数の事です。
でたらめな値ではありますが、実はでたらめではありません。
え?。。。って思いますよね。
ここでは、皆さんも聞いた事あると思いますが、『確立』に関わってきます。
今、コインを一枚投げて、裏か表かで右の道を進むか、左の道を進むかを選択しようと思います。
このコインが裏か表かをコンピュータで求めるのが乱数です。
コンピュータに裏とか表の概念はありませんが、こうしたらどうでしょうか?
乱数で0がでたら裏、1がでたら表とする。
こうしたらコンピュータでも求める事できますよね?
プチコンの場合、表か裏かの判定をする変数を仮に変数Aとすると。。。
A=RND(2)
プチコンの乱数関数は引数で指定した最大値以下の正の整数を返します。
2を引数にすると0、1が返される値となります。
ここで、一つ落とし穴で。。。なぜ、コインを使うかです。
表がでるか、裏が出るかわからないからですが、
もし、表ばかりでるコインだったら。。。あなたはコイン投げますか?
そうです。
表か裏かわからないけど、表ばかりでるコインや裏ばかりですコインだったら。。。
コイン投げる必要が無いのです。
コインの場合表と裏しかない(稀にコインが立つ場合がありますが。。。)ので
表のでる確率は2分の1、裏がでる確率も2分の1です。
サイコロの場合は。。。1から6までので目があります。
各々の目がでる確率は6分の1です。
これが偏ったら。。。いかさまサイコロといいます。
要するにすべての数値はみな平等な確率があるのが一様な乱数になります。
2)一様でない乱数
これは数学的な乱数でなく、そのでる値に偏りがあっても良い場合に使用されます。
プチコンの場合はどうでしょうか?
試しにプログラムで調べてみても面白いかもしれませんね。
ただし、サンプルは今回は省略します。
次に返す値のパターンですが、
プチコンの場合、返す値が引数を最大値としてこれ以下の(最大値は含まない)値を返します。
その他に実数の乱数の場合は引数が無くて、返される値が1未満の少数となるものもあります。
この場合、その処理系で数値の精度が変わりますが単精度実数と呼ばれるもには、有効桁数が6桁となるものがあります。
この有効桁数は実数の使用範囲の事で6桁の場合
0.0から0.999999までであれば問題ないというわけです。
この様な関数があった場合にはこの乱数関数の値に最大値を掛けて
整数部分を取り出すと最初話した乱数が作れます。
最後にプログラムでの落とし穴なんですが、
プチコンの場合には落とし穴付き乱数になっています。
数学的乱数でかつ落とし穴がない乱数関数の場合、
必ずセットでRANDOMIZE関数がついてきますが、
プチコンには無いので。。。要注意です。
RANDMIZE関数は引数に乱数の種を指定します。
『種』?。。。なに?って思いますが、乱数の選択です。
例えば種に0を指定するわけです。
そうすると乱数関数を呼び出す毎に乱数が返されます。
え?
じゃ、なに?
うん、実はRANDOMIZEは乱数のリセットをします。。。リセット?
0番の乱数を使い始めるという意味です。
乱数は実は同じ順番で値が返されます。(そうでない場合もあります、そうプチコンww)
なんでかというと。。。
例えばプレイヤのプレイをリプレイするときもしこのリセットが無いと
敵の動きが乱数で作られているものは、
リプレイする前の値が出ない場合に、
動きが変わりますよね?
じゃ、プレイの再現できますか?。。。できません。
だから、乱数のリセットを行い、同じ順番に乱数を返してもらう必要があるんです。
プチコンの場合は。。。再現はしない方向で考えてください。
けど、これはゲームがスタートする前にデモプレイとかあるでしょ?
これできませんから。。。少し笑えます。