パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

乱数

今回は乱数について解説します。ゲーム作成では必修科目のコマンドですが、
難しいことはいっさいありませんので、すぐに使いこなせるでしょう。


1 RND

(1) RND
乱数を得るにはRNDという関数を使います。
多くのBASICではRNDの機能は以下のN88BASICの通りですが、仕様の違うBASICもありますので
一度お手持ちのマニュアルでお確かめ下さい。

RND 書式 (N88BASICの場合)
RND (数式)
数式 負: 乱数系列を初期化する。
    0:  1つ前と同じ乱数の値をとる。
    正: 次の乱数値を発生する。

数値を省略した場合は、正の数を設定した場合とおなじになります。

発生する乱数値は0以上、1未満の数値です。RUN,CLEARが実行されるごとに、いつも同系列の
乱数値が発生します。

RNDを使用する時の注意点としては、「RUN,CLEARが実行されるごとに、いつも同系列の乱数値が
発生する
」という点です。”同系列の乱数が発生する”といわれてもピンとこない方もいるかもしれませ
んが、すなわち、実行するたびに、同じパターンで乱数が発生するということです。
ゲームの場合ですと、せっかく乱数を使っているのに、毎回同じパターンになってしまうということです。

試しに以下のプログラムを実行してみて下さい。

10 cls
20 for i =0 to 5
30 print rnd(1)
40 next

何度実行しても同じ乱数のパターンになってしまうはずです。これでは、乱数の意味がありませんね。
(下記はN88互換BASICの場合です。N88互換BASICの場合は実行ファイルWINBASIC.EXEを起動しなお
しながら試してみて下さい。毎回同じパターンで乱数値が発生するなずです。)


乱数の系列を変更するには、ちゃんとRANDOMIZEという命令が用意されています。安心ですね。
RANDOMIZEについては、後ほど説明しますので、もう少しRNDの機能について調べてみましょう。

次は数式に0と負の数を設定した場合です。
以下のプログラムを実行して見てください。

10 cls
20 for i =0 to 5
30 print rnd(1)
40 next
50 print rnd(0)
60 r = rnd(-1)
70 for i=0 to 5
80 print rnd(1)
90 next

実行結果の6,7行目で.7747401が2回並んでいますが、7行目は上のプログラムの50行 PRINT RND(0)
の実行結果です。RND(0)を実行すると前と同じ乱数値を発生します。
下の実行結果の8行目以下は、上のプログラムの60行 R = RND(-1) により乱数系列が変更され、新しい
乱数系列で発生された乱数です。(ただし、乱数系列の変更も一定のルールに基づいて行われるため、
実行するたびに、同じ乱数系列に更新されます。これでは、結局パターン化から逃れることはできませんね)



今まで、N88Basicあるいはそれと同じ仕様のRNDの説明をしてきましたが、これとは違う仕様
のBasicもあります。
例えば、99Basicでは単に
RND
とすると0〜1の乱数を発生し、
RND(整数)
とすると、0〜整数-1の乱数を発生します。(RND(100) なら0〜99の乱数を発生する)

Basicによって若干仕様が異なることがありますので、仕様書で確かめてみて下さい。


(2)サイコロを作る
RNDは0以上、1未満の数値を発生します。では、サイコロの出目(1〜6の整数)を得るにはどうしたら
いいでしょうか。
ゲームでよく使われる方法ですが、
R = INT(RND*6) + 1
のようにすると、1〜6の整数がランダムに得られます。

RNDは1未満の乱数を発生させますので、RND*6は、0以上6未満の実数になります。
これをINTで整数に直すと(INTは少数点切り捨てで整数にします)、INT(RND*6)で
0から5までの整数をランダムにつくることができます。これに1を足して、1〜6の整数を
得るわけです。


2 RANDOMIZE

新しい乱数系列を設定するのが、RANDOMIZEです。
書式は
RANDOMIZE (式)
です。
式の部分は一般に乱数の種(seed)と呼ばれていますが、この乱数の種を変更することにより、
RNDで得られる乱数系列を更新します。もちろん、同じ種では毎回同じ乱数系列になってしまい
ますので、ゲームで使用する場合には、以下のようにして、RANDOMIZEの実行された時の、現在
時刻の秒を与えたりします。
RANDOMIZE (VAL(RIGHT$(TIME$,2)))
これによって、実行のタイミングにより0〜59まで60通りの種が得られることになります。

99Basicは、ゲーム作成を意識したBasicのためか、単にRANDOMIZEと記述すると、自動的に
現在時刻の秒を種とするようになっています。これはちょっと便利な仕様ですね。

※(補足)コンピュータが作る乱数について
コンピュータでは乱数を、いかにもランダムな値が発生しているかのように見せかけていますが、
実際はある計算に基づいて発生させています。
どのように乱数を作っているかについては「乱数を使うための準備」をご参照下さい。
C言語を使った説明ですが、原理はBASICでも同じです。




TOP PAGE >Basic活用研究目次