2017/04/19
2020/05/04
Rでサイコロの和のシミュレートをしてグラフ化する
R言語はシミュレーターとして使うことができます。例えば、コインを100回投げたときに表が何枚出るのかを、実際にやってみるのは大変です。また、サイコロを1000回ふって、実際にどの目も(約)6分の1の確率で出ることを体感して確認しようとしたらなかなか骨の折れる作業になるでしょう。この場合、Rのシミュレーターを使えば、実際にコインやサイコロを投げるという試行をしなくても、プログラムによって、シミュレーションを行うことができます。今回は、Rを使った、サイコロ投げのシミュレーションを行う方法をご紹介します。また複数のサイコロの場合、「試行回数が多いとサイコロの目の和正規分布に従う」という性質をR上で棒グラフを描くことによって確認していきたいと思います。
※R言語入門のトップページはこちら
sample関数を用いたR上でのシミュレーション
R言語で、シミュレーションを行うときは、sample関数を使います。具体的には以下のようにします。
sample(ベクトル,size=シュミレート回数,replace=TRUEorFALSE)
これによって、指定したベクトルの要素からランダムに一つ取り出すという試行を指定したシミュレート回数、シミュレーションを行います。また、反復試行の際に前回取り出した要素を戻すかどうかをreplaceによって指定します。TRUEの場合は、戻して、反復試行、FALSEの場合は戻さずにベクトルの要素を一つ減らして、試行を行います。
具体的に、コインの場合とサイコロの場合でシミュレートしたプログラムは以下のようになります。
coin = c(“表”,“裏”)
sample(coin,size=10,replace = TRUE)
[1] “裏” “裏” “裏” “裏” “表” “裏” “裏” “表” “裏” “表”
dice = 1:6
sample(dice,size=100,replace = TRUE)
[1] 3 1 2 1 4 2 5 3 5 2 4 1 4 1 2 6 1 5 1 1 2 1 6 5 3 6 3 4 4 3 6 4 2 1 5 3 5 4 3 3 1 5 1 5 6 1 6 1
[49] 6 3 6 5 2 1 4 6 3 4 6 1 5 2 2 4 1 1 4 2 1 2 5 2 4 3 4 5 4 6 2 4 2 1 4 5 3 6 6 5 3 4 3 2 4 2 6 6
[97] 2 6 1 5
シミュレートしたサイコロの合計を棒グラフ化
試行回数が多く、サイコロも多い場合、その分布は正規分布に近くと言われています。それが本当に正しいのか、Rのシミュレート機能によって検証してみました。シミュレート回数は1万回に設定しました。
サイコロが2個の場合
dice <- 1:6
sumr = 0
for(i in 1:10000)
{
a= sample(dice, size = 2, replace = TRUE)
sum = sum(a)
sumr= c(sumr,sum)
}
sumr = sumr[-1]
table = table(sumr)
barplot(table,col=“blue”)
サイコロが5この場合
dice <- 1:6
sumr = 0
for(i in 1:10000)
{
a= sample(dice, size = 5, replace = TRUE)
sum = sum(a)
sumr= c(sumr,sum)
}
sumr = sumr[-1]
table = table(sumr)
barplot(table,col= “red”)
サイコロ5個色カラフル版
RColorBrewerというパッケージを使って、グラフの色をカラフルにしてみました。(レインボー)
library(RColorBrewer)
dice <- 1:6
sumr = 0
for(i in 1:10000)
{
a= sample(dice, size = 5, replace = TRUE)
sum = sum(a)
sumr= c(sumr,sum)
}
sumr = sumr[-1]
table = table(sumr)
barplot(table,col=brewer.pal(11, “Spectral”))
※R言語入門のトップページはこちら
COMMENT
-
荒 2018.4.8 6:16 PM
以下のプログラムの方がループを使用しなくてすむので早く、短く書くことができます。
dice <- 1:6
m <- 5 # サイコロの数
n <- 10000 # 繰り返しの数a <- matrix(sample(dice, m * n, replace = TRUE), m, n) # まとめて乱数を生成
sumr <- colSums(a) # m個分のサイコロの目を合計table(sumr)
これを1行で書くなら
table(colSums(matrix(sample(dice, m * n, replace = TRUE), m, n)))
荒 2018.4.8 6:16 PM
以下のプログラムの方がループを使用しなくてすむので早く、短く書くことができます。
dice <- 1:6
m <- 5 # サイコロの数
n <- 10000 # 繰り返しの数
a <- matrix(sample(dice, m * n, replace = TRUE), m, n) # まとめて乱数を生成
sumr <- colSums(a) # m個分のサイコロの目を合計
table(sumr)
これを1行で書くなら
table(colSums(matrix(sample(dice, m * n, replace = TRUE), m, n)))