8月26日(火)午後
プログラムコードを書くときはスーパーpre記法を利用した方が分かりやすいとの助言を先生から頂いたので、これからははてな記法モードを使うことにする。
はてなブログを使うにあたりブラウザの設定を変えたところ、ポップアップ広告が出てくるようになって大変だったが、設定は変えなくてもはてなブログは使えると判明したので、差し当たり解決した。
麻雀風(??)ゲームの関数の改良とそのプロット
午前の成果に改良を加えて使いやすくした。
myfunc01<-function(x,N){ a<-0 for(i in 1:N){ 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))>x)a<-a+1 else a<-a } return(a/N) } > myfunc01(10,10000) [1] 0.8445 > myfunc01(15,10000) [1] 0.4544
さらに、カットオフ値による確率の変化をプロットしてみた(N=10000とした)。
x<-3:27 p<-c() for(i in 3:27)p<-c(p,myfunc01(i,10000)) plot(x,p)
結果は下の通り
きれいなグラフができた。
※ここに至るまでに、
myfunc01(3:27,10000)
としてエラーが出てしまい、「??」となることがあった。
「3:27」がベクトルであることを意識せず、
sqrt(1:5)
のときのようにうまいこと計算してもらえると思っていた。
forを利用するのが正解だったらしい。
ベクトルを代入してよいのは、ベクトルに対応した関数だけであると分かった。
山田先生からの課題の一般化
4個の数字から2個の数字を選ぶという課題を、N個の数字からn個の数字を選ぶ場合に一般化してみる。
runif()だけでは難しかったが、ネットで見つけてきたfloor()の利用によって可能になった。
myfunc01<-function(N){ floor(runif(1, 1, N+1)) } myfunc02<-function(N,n){ y<-1:N for(i in N:n+1)y<-y[c(-myfunc01(i))] return(y) } > myfunc02(4,2) [1] 1 2 > myfunc02(100,50) [1] 1 3 6 9 13 14 16 19 20 22 23 29 31 32 33 36 37 39 40 44 45 46 48 49 50 53 55 56 59 60 63 64 65 66 67 68 72 75 77 78 79 85 88 89 90 [46] 92 93 94 96 98
書き方次第でfloor()を使わずともできそうな気はするが、どうすればいいのか分からない。
頭の片隅に置いておいて、これから勉強する中でやり方が発見できることに期待する。
明日は、これらが本当に一様であるかの検定をRを用いてやってみようと思う。
以上