• ベストアンサー

99BASICプログラムの乱数の計算について

学校で出た問題で、サイコロを2個振り、(乱数生成で代用)出た目の和がどのような 確率で分布するか調べなさい、と出たのですが、問1のプログラムがあっているのかと、問2を ヒントだけでも教えてください。お願いします。 問題↓ 回数を記憶する配列 f( ) を用意 1 r1=rnd(6)+1:r2=rnd(6)+1  2個のサイコロを振るr1、r2は1から6の目を生成 2 r=r1+r2 出た目の和を求める 3 f(r)=f(r)+1 和がrである回数を求める 4 1から3までを50000回繰り返す 5 cint(f(r)/f(2))をr=2からr=12まで順に表示する 問1 アルゴリズムに沿ったプログラムリストを示せ 問2 cint(f(r)/f(2))の表示結果を示し、簡単にその妥当性を検討せよ で、書いたプログラムが 10 dim f(12) 20 for i=1 to 50000 ←ここでサイコロを振る回数を決める? 30 r1=rnd(6)+1:r2=rnd(6)+1 40 r=r1+r2 50 f(r)=f(r)+1 60 next i 70 for i=1 to 6 80 print cint(f(r)/f(2)) 90 next i 100 end で、結果が縦に3が6個ならんだのですが、問1はこれでいいのでしょうか。 問2の妥当性ってどういうことでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.8

あとはcint(f(r)/f(2))の実行結果が何を意味しているか、を書けばおそらくだいたい問題ないでしょう、というかそれがないと何故「従って……」なのか意味不明だったりします。 あと一息ですから、そこは自力で頑張ってくださいね。

sigure7
質問者

お礼

D-Matsuさん、レスが遅くなって申し訳ありませんでした。 無事に解決することが出来ました。 本当に有難うございました。

その他の回答 (7)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.7

あー、でもこれなら実行結果を確率分布側にあわせたほうがいいですね。 実行結果は1 2 3 4 5 6 5 4 3 2 1で、この総和は36。 従って各出目の確率分布は1/36, 2/36, 3/36, 4/36, 5/36 ...になるので妥当、と。

sigure7
質問者

補足

こう書くことにしてみましたー。 2個のサイコロで各目の和が出る理論上の確率分布は、それぞれ 1/36 2/36 3/36 4/36 5/36 6/36 5/36 4/36 3/36 2/36 1/36になる。 cint(f(r)/f(2))の実行結果は1 2 3 4 5 6 5 4 3 2 1で、この総和は36。 従って各和が出る確率分布は1/36 2/36 3/36 4/36 5/36 6/36 5/36...となるので妥当である。 Σd(≧ω≦) ほとんどD-Matsuさんのまる写し! 書き方こんな感じで良いでしょか。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.6

計算結果としては、一番低い2の回数から見た各出目の回数の比が出る訳です。 これと理論上の確率を比較して妥当かどうか、ってのが検証な訳ですね。 なお#4の例示で3の確率を通分してしまったのが微妙にまずかったのかもしれませんが、6と8の確率は5/36です。 各出目の理論上の確率は 1/36, 2/36, 3/36, 4/36, 5/36, 6/36, 5/36 ... なので、プログラム同様に2の確率である1/36で割ることで分母が取れて1,2,3,4,5,6,5 ...になり、プログラム実行結果と等しいので妥当といえる、と。 #あ、こっちのがわかりやすいでやんのorz

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

各出目の確率を2の確率で割ってみましょう。

sigure7
質問者

補足

cint(f(r)/f(2))は、各和の出た回数を2の回数で割り、四捨五入するという意味なので、各和の出た回数を2の回数で割ると、12345654321になる。 2個のサイコロで和が出る確率はそれぞれ1/36 1/18 1/12 1/9 1/7 1/6 1/7 1/9 1/12 1/18 1/36 同じように各和の確率を2の確率で割ると 1/36÷1/36=1 1/18÷1/36=2 1/12÷1/36=3 1/9÷1/36=4 1/7÷1/36=5 1/6÷1/36=6 1/7÷1/36=5 1/9÷1/36=4 1/12÷1/36=3 1/18÷1/36=2 で、cint(f(r)/f(2))の表示結果12345654321と同じなので妥当。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー これで完成でしょうか。。。? 各出目の確率を2の確率で割る数と、cint(f(r)/f(2))の表示結果が同じ になりました!なんか分かったような気がします! アドバイスマジで感謝っす!

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

> 70でRが2だから80で(f(2)/f(2))となって、f(2)が1372だから > 1372を1372で割ってみると1になったので、これが結果の1と > いうことでしょうか。 まぁそういうことです。「各目の回数を2の回数で割る」ってことですね。 一方、2が出る確率は1/36、3が出る確率は1/18…… ってことで、あとはどうすれば検証になるかはわかりますね?

sigure7
質問者

補足

プログラムででた数値と、サイコロを2個振ったときに出る目の和の確率 の分布は似てるからおっけー、でいいんでしょうか。 ウィキペディアの確率分布の項目の、サイコロを二つ振ったときの確率 と同じ数字だったので、、、 今まで考えていたんですが、やっぱり分かりませんでした。。。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

> 問2はグラフ書けばいいのかな? グラフを書く必要はないでしょう。出てきた値の検証だけで十分です。 f(r)/f(2)(2≦r≦12)の式が何を表してるかがわかれば、各rに対しどんな結果が出ていれば良さそうなのかはわかるはずです。

sigure7
質問者

補足

>f(r)/f(2)(2≦r≦12)の式が何を表してるか 今気付いたのですが、問題5のあとに書いてある文字を入れ忘れてました すいません。cint(X)でXを四捨五入 って書いてありました。 10 dim f(12) 20 for i=1 to 50000  サイコロを振る回数 30 r1=rnd(6)+1:r2=rnd(6)+1 2つのサイコロを振る 40 r=r1+r2  出た目の和を求める 50 f(r)=f(r)+1  和がrである回数を数える 60 next i 70 for r=2 to 12 r=2からr=12まで 80 print cint(f(r)/f(2))  四捨五入??? 85 print "和"r,"和が出た回数"f(r)"回" 90 next r 100 end と書いて実行してみると、結果が12345654321と出ました。 70でRが2だから80で(f(2)/f(2))となって、f(2)が1372だから 1372を1372で割ってみると1になったので、これが結果の1と いうことでしょうか。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

70~90のforループで ・カウンタがiであるにも関わらずfの添え字がrなので、同じf(r)(最後に出たr1とr2の合計値の回数)を表示するだけ ・2~12まで表示する、とあるのに1~6になっている のは明らかにおかしいですね。 問2はプログラム実行結果が実際の確率分布に沿っているかどうかを見るのが目的でしょう。

sigure7
質問者

お礼

プログラム自体がいまいち理解できてなかったので助かりました。 70 for i=1 to 6を変えれば良かったんですね。 問2はグラフ書けばいいのかな? D-Matsuさん、解答ありがとうございます!

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

>5 cint(f(r)/f(2))をr=2からr=12まで順に表示する ↑はどこに有りますか?

sigure7
質問者

お礼

3 f(r)=f(r)+1アタリから混乱してました。 don_goさん、解答ありがとうございます!

関連するQ&A