おーしまブログ

プログラミングやってます

【意外】BINGOする確率を調べてみた

こんにちは、おーしまです。

今回は、この前作ったBINGOプログラムを用いて、

「何度ルーレットを回すとBINGOするのか」

の、データを取ってみました。


こちらのプログラムを使用しています。
tomo-bb-aki0117115.hatenablog.com


f:id:tomo_bb_aki0118115:20201011185034p:plain

調べると、一般的なBINGOカードは1~75の数字を用いるらしいので、
プログラムを変更し、1~75の数字で、ビンゴカードを作るようにしました。

結果

f:id:tomo_bb_aki0118115:20201011190013p:plain

解説

こちらはBINGOを10,000回試行した時のデータです。

ランダムに1~75の数字を抽選し、穴が開いても、開かなくても、「1回」
として、それが何回でBINGOするかをまとめました。

そして、10回ごとにBINGOする確率を表示しています。

その下は、

  • 10,000回BINGOした時の抽選回数の平均
  • 10,000回BINGOして、最も早くBINGOした時の抽選回数
  • 10,000回BINGOして、最も遅くBINGOした時の抽選回数

です。

20回以下でBINGOする確率が約2%なので、50人に1人しかいないようですね。
もっと確率高いと思ってた。

一番BINGOしやすいのは、41~50回で約37%となりました。

最速、6回早すぎww

コード

#全体のコードの最後の部分
if count <= 10
    count_num_1 << count
  elsif count <= 20
    count_num_2 << count
  elsif count <= 30
    count_num_3 << count
  elsif count <= 40
    count_num_4 << count
  elsif count <= 50
    count_num_5 << count
  elsif count <= 60
    count_num_6 << count
  elsif count <= 70
    count_num_7 << count
  elsif count <= 80
    count_num_8 << count
  end
  puts count
  count_num << count
end

puts "10回以下でBINGOする確率は#{sprintf("%.2f",count_num_1.length / 100.to_f)}%でした"
puts "11回〜20回でBINGOする確率は#{sprintf("%.2f",count_num_2.length / 100.to_f)}%でした"
puts "21回〜30回でBINGOする確率は#{sprintf("%.2f",count_num_3.length / 100.to_f)}%でした"
puts "31回〜40回でBINGOする確率は#{sprintf("%.2f",count_num_4.length / 100.to_f)}%でした"
puts "41回〜50回でBINGOする確率は#{sprintf("%.2f",count_num_5.length / 100.to_f)}%でした"
puts "51回〜60回でBINGOする確率は#{sprintf("%.2f",count_num_6.length / 100.to_f)}%でした"
puts "61回〜70回でBINGOする確率は#{sprintf("%.2f",count_num_7.length / 100.to_f)}%でした"
puts "71回〜80回でBINGOする確率は#{sprintf("%.2f",count_num_8.length / 100.to_f)}%でした"
puts "\n\n"
puts "BINGOまでの平均回数は#{count_num.sum.fdiv(count_num.length)}でした。"
puts "最速でBINGOしたのは#{count_num.min}回でした"
puts "最遅でBINGOしたのは#{count_num.max}回でした"

最後の部分のコードです。

数字を抽選するたびに、countに1を足して、
BINGOした時のcountをif文で振り分けて
count_num1~8に入れています。

count_numには毎回countを入れます。

最初に10000.timesを記述し、10000回繰り返しています。

sprintf("%.2f",count_num_1.length / 100.to_f)

sprintf("%.2f" で、少数第二位まで表示させています。
count_num_1.length で、配列に何個数字が入っているか調べています。

10,000回試行なので、10,000で割り、それにx100で、%にするので、100で割っています。
/100.to_f とする事で少数まで表示させることができます。
(例:デフォルトでは、100 / 3 = 33 となり、33.3333333333とならない。 )

count_num.sum.fdiv(count_num.length)

上は、配列count_numの中身の数字の平均を出すコードです。

.minで配列内の一番小さい数字、.maxで配列内の一番大きい数字を取得しています。





コードは結構、簡単にできたよ。


今回はここまでです。

それでは、また〜

ここはどこ おれはだれ それに近いものがあんだよ 始めようとした奴らも迷い始めてる 怖がらせないでよ そりゃ甘くはないけど まだまだ 夢見ていい世界なんでしょ {UVERwould「ハイ!問題作」}