• 検索結果がありません。

ランダム事象の生成と擬似乱数

ドキュメント内 ii (ページ 93-96)

シミュレーションはランダムな事象を擬似的に生成するために乱数が必要です。乱数はさいこ ろを振って出る目を記録して行けばいくらでも作り出すことができます。立方体のさいころの代 わりに、正20面体の20の面に0から9までの数字を2回ずつ書いたものを作り、それをさい ころのように転がして出た目を記録すると、0から9までの数字がランダムに並んだ数列が得ら れます。表はこのようにして作ったものの一部です。このような表を乱数表(random numbers table)といいます。

54 79 01 84 56 50 50 13 10 03 70 95 19 24 84 13 36 83 69 87 34 35 78 12 43 65 92 60 99 72 09 13 86 37 06 68 66 26 24 50 21 26 81 93 88 46 69 32 72 29 31 30 29 49 89 69 91 45 55 23 84 06 13 47 81 61 88 38 21 49 06 69 41 03 18

図 乱数表の例

シミュレーションでは大量の計算を必要としますから、さいころを振ってその結果を一々入力 していたのでは非能率です。コンピュータにさいころを振らせることは出来ないのでしょうか。

8.5.1 擬似乱数

コンピュータは人間の作ったプログラムにしたがって順番に計算をして行きますから、そのプ ログラムを知っている人はどういう結果になるか全部分かっています。しかしもし計算された数 列がでたらめのように並んでいて、「次の」数が予測することが出来ないのであれば、それを乱数 と考えても差し支えない、と考えられませんか。このように、数列の計算規則は完全に分かって いるけれど、生成されたものがランダムに並んでいるように見える数列のことを擬似乱数(列)

(pseudo-random numbers)と言います。

ExcelのRAND()関数やRANDBETWEEN()関数は(Cのrand()関数同様)擬似乱数の一例で す。RAND()関数はCの場合と違い、0以上1未満の数を生成し、RANDBETWEEN()関数は離散 整数を生成します。この関数を使えば、Excelを使って擬似的なコイン投げ実験が出来るのはす でに実証済みです。

練習8.8 Excelで擬似的なさいころ振り実験を実行するための関数を書きなさい(関数値が1

から6までの整数で、再計算キーを押すたびにでたらめな数が一つ決まるような関数)。実際に

Excelを使って600回のさいころ振りの実験を行い、度数分布を作りなさい。

ヒント:ExcelRANDBETWEEN(m,n)m以上n以下のランダムな整数を生成します(ただ し、m≤n。度数分布を作るためには「FREQUENCY()」という関数を使います。それぞれの使 い方はヘルプメニューを見て下さい。

8.5.2 参考 擬似乱数を作る

擬似乱数はどのように作られているのでしょうか。簡単な規則ではすぐ見破られてしまうだろ うから、相当に複雑なプログラムを書かないと擬似乱数は得られない、と思いますか。簡単な実 験をしてみましょう。二つの4桁の数abを決めてください。ここでは、a= 1389, b= 8567 としましょう。abを掛けた結果11899563の下4桁9563を取り出し、1番目の数とします。

1389×8567 = 11899563

次にその4桁の数にaを掛けて、その答え13283007の下43007を取り出し、これを2番目 の数とします。

1389×9563 = 13283007

次にその4桁の数にaを掛けて、その答え4176723の下46723を取り出し、3番目の数とし ます。

1389×3007 = 4176723

このようにして計算を繰り返し、その都度下4桁の数字を取り出すことによって数列を作りだ して行きます。

上の例でこのような計算を実行した結果は

8567,9563,3007,6723,8247,5083,287,8643,5127,1403,8767,7363, ...

のようになりますが、この数列の千の位の数字だけを並べると 8,9,3,6,8,5,2,8,5,1,8,7, ...

となります。もし上の計算規則を知らないとしたら、この数列の次の数を予測できますか。

かけ算1回と下4桁を取る(1万で割ってあまりを求める)という操作だけで次に何が来るか 予測できないランダムそうな数列が得られたことになります。4桁の数字を見ると、1の位の数 字は3,7が交互に出現していますが、注意深い人は、上の4桁数列の下2桁だけならば、次に何 がくるか計算しなくても予言できる(分かる)ことに気が付くでしょう。この計算を続けて行く と下3桁にも周期性を発見することになるでしょう。しかし、「次の」数を計算せずに予測する ことは難しいでしょうね。ここで説明した、ランダムに「みえる」数列を作る方法を乗算合同法

(multiplicative congruential method)と言います。割ってあまりを求める計算を合同式と言う からです。

乗算合同法

あらためて乗算合同法による乱数の生成法を説明しましょう。まず三つの正の整数a, P, x0 決めます。次にax0を掛けて、それをP で割ったときの答えを求めます。これをx1としま す。次にax1を掛けて、それをPで割ったときの答えを求めます。これをx2とします。こ のような手順を式にまとめたのが次の式です。modP Pで割った余りを求める、という記号 です

xn≡axn−1modP

手元にコンピュータがある人はa, P, x0の決め方によって、どのような数列が得られるのかを Excelで計算してみて下さい。

乗算合同法による数列はすべて周期性があります。なぜならば、x0, x1, x2, ...0,1,2, ..., P−1 のいずれかの数ですから、最初のP 個の中には必ず同じものがあるはずです。そして、もしn 番目の数xnn+m番目の数xn+mが同じならば、xn+1xn+m+1xn+2xn+m+2、... は等しくなります。つまり、周期的に同じ数列が繰り返されることになります。ですから、同じ ものを使うことがないように、周期が十分に長くなるようなパラメータa, P を選ぶ必要があり ます。

同じように大事なことは、もし同じa, P, x0を使うと常に同じ数列が生成される、ということ

です。C言語でrand()は乱数を生成する関数ですが、srand()を併用しないと、最初に呼んだ

ときに返される値はいつも47でした。rand()関数のアルゴリズムも乗算合同法と同じような考 え方に基づいて構成されており、プログラムを実行する場合は常に同じ初期値から計算が始まる ので、このようなことになるのです。これはちょうど、印刷された乱数表をいつも同じところか ら読み出していることに対応します。乱数表の数の並び自体は何の規則性もなく、でたらめな数 の並びですが、一旦それを記録してしまうと、それは一つのデータに過ぎず、それを何度も再現 させれば乱数の資格を失います。しかし、巨大な乱数表があって、使い始める場所をその都度 変えることができれば、記録された数列でも乱数として使うことができることが期待できます。

srand()はこの使い始める場所を指定するための関数だったのです。

Excelのrand()関数も、以前はCのrand()関数と同じ問題を抱えていましたが、最近は初 期値が自動的にランダム化されているようです。しかしそれとても、安心できません。大きなシ ミュレーションを実施する場合には注意するようにしてください。

練習8.9 次の手順に従って、Excelで乗算合同法数列を作りなさい。

(1)セルA7 :A1070から始まる通し番号を入力しなさい。

(2)セルB3131、セルB410000を入力しなさい。セルC7に適当な数を入力しなさい。

(3)セルB8に「= $B$3∗C7、セルC8に「= mod(B8,$B$4)、セルD8に「=C8/$B$4 と入力しなさい。

(4)セルB8 :D6をセルB9 :D107にコピーペーストしなさい。

(5)セルD8 :D106を「Xの値」、セルD9 :D107を「Y の値」として、散布図を描きなさい。

(6)セルB3の数字を変えてC列の数字の変化を調べなさい。例えば「15」と入力したらどう なりますか。

ドキュメント内 ii (ページ 93-96)