パソコン活用研究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と記述すると、自動的に
現在時刻の秒を種とするようになっています。これはちょっと便利な仕様ですね。



TOP PAGE
>Basic活用研究目次