確率統計2022 R 入門 2章 確率と統計
乱数によるサイコロのシミュレーション
乱数を用いて,通常の6面体のサイコロにおいて,1の目がでる確率が1/6と なるかどうか,確かめてみよう。
サイコロを600回,6000回,60000回,600000回,振り, 1の目がでる回数が1/6に近いかどうを調べる。
1~7未満の乱数を一回発生させる
- runif
- r は random, unif はuniform
(dice <- runif(1, min=1, max=7))
3.3882096176967
1~6の間の整数 (サイコロの目)にする
(dice <- floor(runif(1, min=1, max=7)))
1
100回振る
(dice <- floor(runif(100, min=1, max=7)))
[1] 6 6 5 3 6 6 6 1 2 2 6 3 6 6 1 6 3 1 6 4 2 6 3 4 2 5 6 5 1 1 3 4 6 3 2 5 2 [38] 3 5 4 6 3 2 6 6 5 6 2 5 2 4 5 5 3 2 3 2 5 1 4 3 3 6 2 4 6 4 2 3 3 5 3 5 6 [75] 6 6 2 2 5 5 3 4 4 2 1 4 6 1 4 4 1 1 6 2 4 4 1 5 5 5
1の目の数を数える
length(dice[dice==1])
11
(dice <- floor(runif(1, min=1, max=7)))
2
一様乱数を発生させる関数は第1回目の演習で紹介したrunifを使う。 これを 使って、次のようにすれば、100回のサイコロ振りをシミュレーションできる。
x <- floor(runif(100,1,7))
この結果、xには1,2,3,4,5,6のいずれかの数、合計100個の数を要素とするベクトルが値になる。そこで、1の目の出現回数は次のようにして求められる:
length(x[x==1])
もしくは、次のようなコードを書いても良いだろう: (nの値は適宜変える)
sim <- function(n=100) { x <- floor(runif(n,1,7)) for(y in 1:6) { cat(y,"=>\t",length(x[x==y]),"\t",length(x[x==y])/n, "\n") } }