« ツマグロヒョウモン | トップページ | マツバボタン »

2012年11月30日 (金)

鏡の話:9:余話7

★乱数が必要なら
ゲームにサイコロはいいですが、シミュレーションなどする時に、大量の乱数が必要になったときにサイコロは手間がかかる。コンピュータで乱数を発生させる、という手があります。

★エクセルのシートで使う関数には「RAND関数」というのがあります。
ヘルプから引用

0 以上で 1 より小さい実数の乱数を発生させます。ワークシートが再計算されるたびに、新しい乱数が返されます。
書式:RAND()
解説: a と b の範囲で乱数を発生させるには、次の数式を使います。
RAND()*(b-a)+a

他にも、「RANDBETWEEN関数」というのもあります。

指定された範囲内の整数の乱数を返します。ワークシートが再計算されるたびに新しい乱数が返されます。
書式:RANDBETWEEN(最小値,最大値)
最小値       乱数の最小値を整数で指定します。
最大値       乱数の最大値を整数で指定します。

シート上で済む話でしたら、これが使えます。

★VBAでプログラムを書くなら「Rnd関数」があります。
「RANDBETWEEN関数」はないようです。(シート関数を引っ張って来るという手はありますけど。)

単精度浮動小数点数型 (Single) の乱数を返します。
構文:Rnd[(number)]
引数 number は省略可能です。引数 number には、単精度浮動小数点数型 (Single) の数値または任意の有効な数式を指定します。

解説:Rnd 関数は 0 以上、1 未満の範囲の値を返します。
・・・
システム タイマーから取得した新しいシード値を使って、乱数ジェネレータを初期化するには、Rnd 関数を呼び出す前に、引数を指定せずに Randomize ステートメントを実行してください。

任意の範囲の整数の乱数を生成するには、次の式を使ってください。
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

★サイコロシミュレーションなどやってみたくなりますね。
1~6の数をランダムに発生させたいわけですから
0≦x<1   これに6{=6-1+1}を掛けます
0≦x<6   さらに1を足します
1≦x<7
1≦a<2、2≦b<3、3≦c<4、・・・、6≦f<7
区間の幅は等しいですね。
ですから、このxの整数部を「Int(x)」として取り出します。
「Int((upperbound - lowerbound + 1) * Rnd + lowerbound)」の意味はこういうことなのです。

★ヘルプに「シード」という言葉が出てきますね。これは「ランダム・シード(乱数の種)」です。
「計算機」が出してくる「乱数」は計算で作ります。パソコン内部でサイコロを振っているわけではありません。
例えば、長い数字を自乗して、真ん中あたりから同じ長さの数字を取り出して、また自乗して、なんてことを繰り返すと、かなりでたらめな数字列が得られます。でも「疑似乱数」です。
{平均採中法といいます。}
最初に用意した長い数字=乱数の種を、また使えば、また同じ「ランダム風数字列」が出てきてしまいますね。
で、たとえば、パソコン内部で、刻々とかわる時刻などを「種」にして、繰り返されることのない疑似乱数を発生させよう、ということなのですね。
通常の使用に於いては、こうやって得られる乱数は、十分にランダムです。
乱数の検定、というのもありますが、ここでは踏み込みません。

昔、私の兄は大学の卒論で確か、コンピュータによる乱数の発生というようなことをやってましたっけ。50年近くも前のことです。計算によって数を作ると、必ず長い周期とはいえ「繰り返し」が発生するのですね。それをどのように回避するか、というのは重要な問題なのです。(古い話に飛びました、失礼。なんせ、記憶装置は磁気ドラム、という時代のことです。パソコンなど存在しませんでした。)

★エクセルのVBAで、サイコロの6つの目が均等に出るのかどうか、シミュレーションをしてみました。

プログラムの内容を例え話でイメージ化すると
●数学の先生が、授業で40人の生徒に対して、「各自が25回サイコロを振って、出た目を報告してください」と数学実験を始めます。そうすると、総計1000回サイコロを振った結果ができます。
こういう授業を100回行って、出た目を累積していきます。
毎年4クラスでこの授業をやって、25年のベテラン先生になる頃、延べ「10万回」を達成しますね。
{ほんとうにこれをやった方がいるかどうかは知りませんが、もしやったら、その記録は、教師間の財産になります。
実は、毎年、トウモロコシの粒々の色の違う粒の数を生徒に数えさせて、記録した生物の先生がいらっしゃって、遺伝の法則のものすごい検証をなさいました。私もそのデータを使わせていただいたことがあります。教師というのも、なかなか、根気のいる、すごい職業でしょ。}

●さてプログラムの実行結果
10万回、サイコロを振ったのですよ、エクセル君が。
Dice

横軸は、「授業の回数」
縦軸は、「出た目の全体に対する割合」です。
目が1か6かなんてあまり意味がないので、6色の色分けで充分ということにしました。

始め、ばらつきが大きいですが、10万回も振ると、大分値が収束してきました。
それでも思ったより結構ばらつくものですね。
最後の方を数値でお目にかけます。
91    0.16668     0.16543     0.16785     0.16658     0.16564     0.16782
92    0.16683     0.16540     0.16793     0.16649     0.16555     0.16779
93    0.16682     0.16532     0.16787     0.16646     0.16571     0.16782
94    0.16683     0.16527     0.16778     0.16638     0.16578     0.16797
95    0.16683     0.16541     0.16753     0.16662     0.16576     0.16785
96    0.16709     0.16538     0.16743     0.16647     0.16583     0.16780
97    0.16722     0.16530     0.16738     0.16653     0.16572     0.16786
98    0.16710     0.16534     0.16739     0.16642     0.16578     0.16798
99    0.16701     0.16556     0.16697     0.16669     0.16572     0.16806
100   0.16699     0.16580     0.16684     0.16652     0.16567     0.16818

グラフを見ると、通常のサイコロを使った遊びでは、6分の1の確率、なんて全然信用できないということがよく分かりますね。10回目のところ、サイコロを累計10000回振ってもまだ大きくばらついています。
人間のやる遊びではそんなには振りませんものね。
遊びは遊び。熱をあげすぎませんように。
ただ、賭場を開く側としては、総計でものすごい回数サイコロを振ることになるでしょう。
素人には技術的にもわからないし、回数的にも判断不能な回数しか振らないとしても、わずかに出目の偏ったサイコロであっても、長年にわたって賭場を開帳していれば大きな儲けを得ることは可能でしょうね。

★参考までに
↓プログラムに興味がおありでしたら
「DiceSimulation.txt」をダウンロード  
どうぞ。

« ツマグロヒョウモン | トップページ | マツバボタン »

理科おじさん」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« ツマグロヒョウモン | トップページ | マツバボタン »

2021年5月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
サイト内検索
ココログ最強検索 by 暴想
無料ブログはココログ