8月26日(火)午前
研究室のパソコンが起動しなかったので家まで自分のパソコンを取りに帰る。
結果的にデスクがいいかんじになったので満足する。
今日からマイコース期間中の活動をブログにまとめることにする。
麻雀風(??)ゲームをRで実装
・1~9までの牌が4枚ずつ、計36枚ある
・3枚引いて、ある数xよりも大きければアガリ
・xの値によってアガっている確率がどのようになるか、Rを使ったシミュレーションで調べる
予想
x=10のとき 0.7くらい
x=15のとき 0.5くらい
以下のようにやってみた
X=10のとき
> mymonte<-function(x){
+ a<-0
+ for(i in 1:x){
+ if (sum(sample(c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9),3))>10)a<-a+1
+ else a<-a
+ }
+ return(a)
+ }
> mymonte(10000)/10000
[1] 0.8448
X=15のとき
> mymonte01<-function(x){
+ a<-0
+ for(i in 1:x){
+ if (sum(sample(c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9),3))>15)a<-a+1
+ else a<-a
+ }
+ return(a)
+ }
> mymonte01(10000)/10000
[1] 0.4478
・X=10のときは予想より高く、X=15のときは予想よりやや低い数字になったものの、想定の範囲内で矛盾のない結果となった。思った通りにシミュレーションできたと考えられる。
・はじめはrunif()を使おうとしていたが、非復元抽出のため、使うのは難しいと判断した。ネットで調べているうちにsample()の存在を知り、利用した。
・myfunc01<-sum(sample(c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9),3))
とすると、myfunc01は固定の値をとってしまい、乱数が利用できなくなった。そのため、上では直接sum(sample(c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9),3))
と入力してある。
後で気づいたが、
myfunc01<-function(){
+ sum(sample(c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9),3))
+ }
とすべきだったようだ。関数を定義するときは、「function()」を入れる必要がある。
続いて、山田先生からの課題
・不等号を用いた真偽判定
・for-loop処理
・runif()関数を使って一様乱数を発生させる
・関数作成
・上の4つのみを用いて、1,2,3,4の4つの数から2個取り出すシミュレーションができるか?
以下のようにしてみた
> myfunc01<-function(){
+ if (runif(1)>3/4)return(4)
+ else if (runif(1)>2/4)return(3)
+ else if (runif(1)>1/4)return(2)
+ else return(1)
+ }#1~4を同様に確からしく抽出する関数
>
> myfunc02<-function(){
+ if (runif(1)>2/3)return(3)
+ else if (runif(1)>1/3)return(2)
+ else return(1)
+ }#1~3を同様に確からしく抽出する関数
>
> x<-c(1,2,3,4)
> y<-x[c(-myfunc01())]
> (z<-y[c(-myfunc02())])#選ばないものをベクトルから取り除く
[1] 3 4
・何度か試してみて、ちゃんと4つの数字から2つを選ぶようなシミュレーションができていることが確認できた。
以上