乱数

でたらめの数

さいころを振ると1〜6のうちどれかがでます。どれがでやすいということなく同じ確率ででます。ただし回数が少ないうちは同数でるとはかぎりません。つまり5回振って1〜5まで一回ずつでたからといって、つぎが6とは限らないということです。回数を重ねると同数に近くなります。

RND関数

このようなでたらめの数(次に何がでるかわからないが、でる確率が決まっている数)が必要になることがあります。これを乱数といいます。完全な乱数を作るのは難しいのですが、BASICにも擬似的に乱数を作る機能があります。

FOR n=1 TO 10
   PRINT RND
NEXT n
END

もちろん次のようにしても同じです。。

FOR n=1 TO 10
   LET x = RND
   PRINT x
NEXT n
END

結果は次のようになります。

 .236706956399934 
 .333816213688728 
 .449103466444231 
 8.19605281958173E-2 
 .510597387100848 
 .610285003953746 
 6.00614506099659E-2 
 .452800401697308 

8.19605281958173E-2 は 0.0819605281958173 のことです。RND という関数は呼ばれるたびに 0≦RND<1 である乱数を返します。(乱数を発生するともいう)

1から6の乱数を出す

RND関数が発生する乱数は 0≦RND<1 ですから、これからさいころの目を出すには少し工夫が必要です。

FOR n=1 TO 10
   PRINT INT(RND * 6) + 1
NEXT n
END

INT関数が新たにでてきました。これは次の( )内の数の少数部分を切り捨てて整数にする関数です。発生する乱数は 0≦RND<1 ですが、6倍することで 0≦ x <6 となります。これを整数にすると 0≦ x ≦5 となります。最後に1を足すことで 1≦ x ≦6 となるわけです。≦と<の違いに注意してください。

たとえば .236706956399934 なら6をかけて 1.420241738399604 、少数点以下を切り捨てると1、それに1を足して 2 となります。

結果は次のようになります。

 2 
 3 
 3 
 1 
 4 
 4 
 1 
 3 

乱数系列の初期化

実はこのプログラムは,毎回,同じ数字の列を発生します。これを乱数系列といいます。毎回異なる乱数系列を出すためには最初に RANDOMIZE という命令で初期化します。

コンピュータで乱数を作る場合は一般的にある数値を初期値として次々と決まった計算操作で出します。初期値が同じなら出てくる乱数列は同じになります。初期値と計算方法がわかれば次の数が予言できますから完全な乱数とは呼べません。しかし、計算方法も複雑で初期値も莫大な数から選ばれるので事実上予測できません。そこでこのような乱数は擬似乱数と呼ばれます。

RANDOMIZE
FOR n=1 TO 10
   PRINT INT(RND * 6) + 1
NEXT n
END

本当に確率は1/6か

本物の「さいころ」ならば、次の数が予想できないのですが、数多く振っているとそれぞれの数が出る確率は6分の1になるはずです。RND関数から作ったさいころがそうなっているか確かめます。

RANDOMIZE
DIM me(6)
FOR n = 1 TO 10000
   LET i = INT(RND * 6) + 1
   LET me(i) = me(i) + 1
NEXT n

FOR n = 1 TO 6
   PRINT n;me(n)
NEXT n
END

1が出るたびに me(1) に1を足し、2が出るたびに me(2) に1を足します。こうして me(i) にはiという目が出た回数が記録されます。最後にそれを表示しています。

完全には6分の1になりません。多くすればするほど近づいていきます。

 1  1671 
 2  1674 
 3  1638 
 4  1677 
 5  1693 
 6  1647 

例33

1から10までの乱数を発生させる式をつくり、上の例のように多数回乱数を発生させてだいたい同数回になることを確認するプログラムを作りなさい。

例34

さいころの代わりになるプログラムを作りなさい。つまり、1回の実行で1から6の目が1つ出てくるプログラムにします。出てくる目は数字ではおもしろくないので、さいころに近くなるように工夫します。たとえば、

PRINT "●   ●"
PRINT
PRINT "  ●"
PRINT
PRINT "●   ●"

というようにしましょう。


聖愛高等学校
http://www.seiai.ed.jp/