鍋あり谷あり

テーマを決めずに適当に書いています。

ダイスで組分けの続き

another さんが d:id:another:20070821:1187714499 で計算してくださったので、私も計算してみた:

require 'rational'

def count( rest, c )
  @h[c.sort] ||=( if 0==rest
    c.find{|i| i==1 } ? 1 : 0
  else
    (0...6).inject(0){ |s,ix|
      c1=c.dup
      c1[ix]+=1
      s+count( rest-1, c1 )
    }
  end )
end

(1..ARGV[0].to_i).each{|i|
  @h={}
  r=Rational( count( i, [0]*6 ), 6**i )
  puts "#{i} : #{r.to_f} == #{r}"
}  

当初は hash をつかわずアホのように数えてたんだが、another さんのソースを見てキャッシュすることにしたら、夢のように速くなった。

オブジェクトなんてちっとも指向してなかったり、出力形式が投げやりだったりするのは仕様。
@h の辺りにやる気のなさが出てると思う。

それと。

      c1=c.dup
      c1[ix]+=1
      sum+count( a, done+1, c1 )

の部分。
c1 で受けるのがちょっといやで、

      sum+count( a, done+1, [cとixを含むそれほど長くない式] )

と書きたかったんだが、いいのが思いつかなかった。


出力も書いておこうか。

1 : 1.0 == 1
2 : 0.833333333333333 == 5/6
3 : 0.972222222222222 == 35/36
4 : 0.925925925925926 == 25/27
5 : 0.960648148148148 == 415/432
6 : 0.945216049382716 == 1225/1296
7 : 0.948966906721536 == 44275/46656
8 : 0.940357796067673 == 32905/34992
9 : 0.931418252743484 == 173825/186624
10 : 0.918691137339328 == 4629145/5038848
11 : 0.901406680653991 == 18168205/20155392
12 : 0.879291754782045 == 2953745/3359232
13 : 0.851715605340157 == 1853999485/2176782336
14 : 0.818071338085929 == 5342289715/6530347008
15 : 0.778280783551587 == 20329774345/26121388032
16 : 0.732966058605163 == 21539352185/29386561536
17 : 0.683322900171363 == 642576334555/940369969152
18 : 0.630864424115939 == 197748653015/313456656384
19 : 0.577167302347267 == 58617086216815/101559956668416
20 : 0.523683382691944 == 79777892481245/152339935002624
21 : 0.471629610675817 == 574784193885335/1218719480020992

n=8 まで増減を繰り返しているが、その後は単調減少らしい。

簡単な式にはならなさそうな雰囲気に見える。