Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

サイコロの問題

お試し算数 サイコロの問題」を実際に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回になりますね。