読者です 読者をやめる 読者になる 読者になる

ガシャポンの確率論(つづき)


前回、ガシャポンのセットを全部そろえるのに何回かかるか、というのを算出するのに、仮に70%と置きました。たとえば4種類のセットの場合、9回ガチャガチャすれば70%の確率で4種類がそろう。5種類のセットの場合、11回やっても70%にならない。いまのところわたしの計算能力ではこれが限度ですが、しばらく考えます。


さて、統計学有意ということばがあって、薬が効くか効かないかなど、従来使われている薬と比べて有効だった治験結果を偶然でないことを確率論的にあらわします。そのとき0.05を使うのが普通なので、その考え方とガシャポンのフルコンプリートと考え合わせると、上記の70%が95%ということではないのか、と思いつきました。そこでプログラムは同じで95%を超えるまでやってみました。


結果、2種類だと6回で95%を超えます。3種類だと11回、4種類だと16回取れば、ほぼ全種類そろう。無論それ以上、100回やってもそろわない人はいるだろうけど、その確率は5%以下である。


うむ、だからなに? と言われそうですが、なんとなく筋道が見えてきたような気がしないでもない。つまり、質問は次のようになります。


質問:6種類のガシャポンをフルコンプリートするのに普通何回かかるか? (ここで普通というのは95%以上の確率でそろうことをさす。)


つづく


追記:20080422
お待たせしました。解決!

6種類のガシャポンを95%の確率でフルコンプリートするには、27回かかります。ガシャポンが5種類だと21回。意外に天文学的数字にはならないということがわかりました。

まず、プログラムを走らせた結果。

ruby fullcomplete.rb
10, 5.0:  0.5225472
11, 5.0:  0.606363648
12, 5.0:  0.678002688
13, 5.0:  0.738115682304
14, 5.0:  0.787907248128
15, 5.0:  0.8287692521472
16, 5.0:  0.8620793266176
17, 5.0:  0.889100957279847
18, 5.0:  0.910942919825818
19, 5.0:  0.928551490824438
20, 5.0:  0.942719430662554
21, 5.0:  0.954102465341675
22, 5.0:  0.963238115964239
23, 5.0:  0.970564175467496
24, 5.0:  0.976435548584285
25, 5.0:  0.981138963230652

25, 6.0:  0.937697859829515
26, 6.0:  0.94798274321112
27, 6.0:  0.956586381800654
28, 6.0:  0.96377803213894
29, 6.0:  0.96978571670773
30, 6.0:  0.97480188640086


プログラムは前回書いたYahoo知恵袋のベストアンサーのアルゴリズムを使いました。

#! /usr/bin/env ruby
# fullcomplete.rb
# this program calculates the times you need to collect full complete set of gashapon

def gasha(n, m, num_var)
# n is the number of times of trials you put money and turn the machine
# m is the number you want to collect
# num_var is the number of full items
if n < m
  return 0
elsif n == 1 && m == 1
  return 1
elsif m == 1
  return (1 / num_var) ** ( n - 1)
else
  return (m / num_var) * gasha(n -1, m, num_var) + ((num_var.to_i + 1 - m) / num_var) * gasha(n - 1, m - 1, num_var)
end
end

num_var = 5.0
for i in (10..25) do
  print "#{i}, #{num_var}:  "
  p gasha(i, num_var.to_i, num_var) 
end
puts
num_var=6.0
for i in (25..30) do
  print "#{i}, #{num_var}:  "
  p gasha(i, num_var.to_i, num_var) 
end