ワンポイントテクニック No.017 G800シリーズ対応

乱数の発生をコントロールする


 シャープのポケコンでは乱数を発生させる命令としてはRNDがあり、RND A(Aは自然数)とすることでA以下の整数の乱数を発生可能になります。すべて同じ割合で乱数を発生させるならばそれでもいいですが、例えば1を80%、2を20%の割合で発生させたいと言う場合はIF文などと組み合わせる必要があります。

IF RND 5=1 THEN X=2 ELSE X=1

 実はこれはX=RND 1.25で同じことができるようになるのです。
 RND AはAの値が自然数の場合は1からAまでの乱数を発生できるのですが、Aが正の小数の場合は1からA+1までの乱数を発生するからです。RND 1.25の場合、1から2の乱数を発生できますが、小数部分の値によってその発生割合は変わってくるのです。
 乱数の発生割合は以下のようになります。

[ 1 ][ 2 ]
 10.25

これを見ての通り全体では、1が80%(1.25分の1)、2が20%(1.25分の0.25)となります。
次にこれがRND 2.3の場合を考えてみます。

[ 1 ][ 2 ][ 3 ]
 1 1 0.3

 上記のように1が約43.5%(2.3分の1)、2が約43.5%(2.3分の1)、3が13%(2.3分の0.3)の発生割合となります。RNDの引数を小数にすることで乱数の発生割合はコントロールすることが可能になるのです。このテクニックは使える場面は少ないですがメモリ節約や高速化に貢献できます。
 ちなみにこのテクニックは引数が1以上の場合のみ有効で、引数が0以上1未満の小数の場合はRND 0(0から1の間の乱数を発生させる)と同等の動作になります。

 あと乱数発生をさせる場合は同じ乱数を発生させたくない場合はRANDOMIZEを使えばいいのですが、そうではない場合はRND A(Aは負の数)とすることで乱数列を初期化できます。これは、引数によって乱数列が変わるため乱数を使ったゲームなどでステージ毎に決まったパターンで乱数を発生させたい(ステージデータの代わりに乱数を使用)ような場合には有用です。

10 INPUT A:A=RND A
20 FOR I=1TO 10:PRINT RND 9;:NEXT


 上記リストでAに負の数を入れた場合、Aの値が同じならばいくら繰り返しても同じ乱数が発生し、これによって発生する乱数がコントロール可能なことが分かると思います。
 また、乱数であるが故に逆算はできないためネームバトルゲームにも有用でこれはADAMでも使用されています。


RETURN

inserted by FC2 system