「お試し算数 サイコロの問題」を実際にRubyでシミュレーションしてみました。
問題
6面ダイスを,全ての目が出揃うまで振り続けます。
出揃うまでの回数の期待値はいくらか。
ex.rb
#!/usr/bin/env ruby # -*- coding: utf-8 -*- # サイコロのすべての目がでたか? def isfinishd?(d) d.each_key {|key| return false if d[key] == nil } return true end # サイコロのすべての目が出るために,サイコロを振った回数を返す関数 def trial time = Time.now srand(time.sec ^ time.usec ^ Process.pid) keys = [1, 2, 3, 4, 5, 6] vals = [nil, nil, nil, nil, nil, nil] alist = keys.zip(vals) dice = Hash[*alist.flatten] n = 0 # 何回,サイコロを振ったか while !isfinishd?(dice) dice[rand(6) + 1] = true # サイコロを振る n += 1 end return n end # 100000回,trialを繰り返し平均を求める。 data = [] 100000.times { data << trial} ave = data.inject(0) {|result, i| result + i} / data.length.to_f puts ave
実行結果
$ ruby ex.rb 14.68094 $ ruby ex.rb 14.68932 $ ruby ex.rb 14.69094
おおよそ,14.7回になりますね。