一様乱数
一様乱数はプログラムを書くものにとって
最も馴染み深い乱数だと思う
単純化すればコインの裏表や
サイコロの出た目の分布だ
例えばサイコロを振って
出た目を棒グラフに記録していく
最初のうちはデコボコだが操作を繰り返せば
全体の割合は「一様」となっていく
組み合わせを使うことによって
もっと大きな「目」を作る事ができる
サイコロでもいいがここではオセロの石を使おう
オセロの石に番号を書いておいて振る
(番号を書くのは振った後に見分けがつくようにだ)
3枚に番号を書いて振れば
2^3 = 222 = 8通りの「目」を表現できる
オセロの石の数をn個とすると
2^n通りの「目」を表現する事ができる
コンピュータは2進数で数を表現する
つまりこれらの「目」は「値」と呼ぶこともできる
それでは2^nではない
例えば3つの「値」を使いたい場合は
どうすればいいだろうか?
3より多い種類の値を作り
値を3種類にまとめればいい
完全な3等分は無理だが2^nのnが大きければ
近い数を取ることはできる
例えば8枚のオセロ石を使って
256種類の値を
85・85・86種類の値ごとにそれぞれまとめれば
3つの値に近い形にする事ができる
[1種類捨てて85・85・85でいいのでは?:r-de-r氏のコメント参照]
Rではrunif()というという関数を使って
これらの「一様」な分布を持った
0〜0.9999999までの乱数を生成できるようだ
()の中には生成したい乱数の数を入れる
x <- runif(100000) #乱数100000個をベクトル(1次元配列)としてxに代入
runif()の頭のrは random の r
unifは「一様分布/Uniform distribution」の略だ
つまりこれらの乱数の分布は「一様分布」となる
生成した乱数は hist() で分布を表示でき
histのbreaks の値で分割する数を決定する事ができる
[sample()を使ったやり方:r-de-r氏のコメント参照]
hist(x,breaks=20) #xの分布を20個に分割して表示
細かい話をすればrunif()の場合
乱数の値は小数点以下7桁までなので
出てくる値は単精度浮動小数点数のようだ
倍精度浮動小数点数のようだ
[単に表示が7桁なだけで内部ではbinary64:r-de-r氏のコメント参照]
単 倍精度浮動小数点数の仮数部は大抵
23ビット52ビット(+1ビットの固定値?)らしいので
23枚52枚のオセロ石を使っていることに等しい
なお64枚のオセロ石を使えば
小数点以下19桁くらいまでの値を表現できる