Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

一様乱数

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

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

例えばサイコロを振って
出た目を棒グラフに記録していく
最初のうちはデコボコだが操作を繰り返せば
全体の割合は「一様」となっていく
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桁くらいまでの値を表現できる

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした