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 まで増減を繰り返しているが、その後は単調減少らしい。
簡単な式にはならなさそうな雰囲気に見える。