LoginSignup
0
0

More than 5 years have passed since last update.

分布について考える-乱数と分布1

Last updated at Posted at 2017-11-12

一様乱数

一様乱数はプログラムを書くものにとって
最も馴染み深い乱数だと思う

単純化すればコインの裏表や
サイコロの出た目の分布だ

例えばサイコロを振って
出た目を棒グラフに記録していく
最初のうちはデコボコだが操作を繰り返せば
全体の割合は「一様」となっていく
qiita01_01-1.png
qiita01_01-2.png

組み合わせを使うことによって
もっと大きな「目」を作る事ができる
サイコロでもいいがここではオセロの石を使おう
オセロの石に番号を書いておいて振る
(番号を書くのは振った後に見分けがつくようにだ)
3枚に番号を書いて振れば
2^3 = 2*2*2 = 8通りの「目」を表現できる
オセロの石の数をn個とすると
2^n通りの「目」を表現する事ができる
qiita01_01-3.png

コンピュータは2進数で数を表現する
つまりこれらの「目」は「値」と呼ぶこともできる

それでは2^nではない
例えば3つの「値」を使いたい場合は
どうすればいいだろうか?

3より多い種類の値を作り
値を3種類にまとめればいい
完全な3等分は無理だが2^nのnが大きければ
近い数を取ることはできる
例えば8枚のオセロ石を使って
256種類の値を
85・85・86種類の値ごとにそれぞれまとめれば
3つの値に近い形にする事ができる
[1種類捨てて85・85・85でいいのでは?:r-de-r氏のコメント参照]
qiita01_01-4.png

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個に分割して表示

qiita01_01-5.png

細かい話をすればrunif()の場合
乱数の値は小数点以下7桁までなので
出てくる値は単精度浮動小数点数のようだ

倍精度浮動小数点数のようだ
[単に表示が7桁なだけで内部ではbinary64:r-de-r氏のコメント参照]

倍精度浮動小数点数の仮数部は大抵
23ビット52ビット(+1ビットの固定値?)らしいので
23枚52枚のオセロ石を使っていることに等しい

なお64枚のオセロ石を使えば
小数点以下19桁くらいまでの値を表現できる

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0