0389 柏拉图骰
* * * *
拉格朗日计划
* * * *
柏拉图骰

掷一个无偏的正四面体骰子,记点数为T。

掷T个无偏的正六面体骰子,记点数和为C。

掷C个无偏的正八面体骰子,记点数和为O。

掷O个无偏的正十二面体骰子,记点数和为D。

掷D个无偏的正二十面体骰子,记点数和为I。

求$I$的方差,四舍五入到4位小数。

本题难度:



解答

令$g(i,j,k)$为用i个j面骰掷出k点概率,则有 $$g(i,j,k)=\frac{1}{m}\sum_{\ell=k-j}^{k-1} g(i-1,j,\ell)$$ 从而若$f(i,j)$表示第i轮后掷出j点的概率,则有 $$f(i,j)=\sum_{k=1}^jf(i-1,k)g(k,d_i,j),$$ 其中$d_i$表示第i轮所使用的骰的面数,递推计算即得结果$2406376.3623$。

注:为便于格式化输出,以下代码为Python 3

d=[4,6,8,12,20]

m=1
fp=[0.0,1.0]

for x in d:
    gp=[1.0]
    fn=[0.0]*(m*x+1)
    for i in range(1, m + 1):
        gn=[0.0]*(x*i+2)
        for j in range(x*(i-1)+1):
            gn[j+1]+=gp[j]/x
            gn[j+x+1]-=gp[j]/x
        for j in range(1,x*i+1):
            gn[j]+=gn[j-1]
        gp=gn
        for j in range(1, x*i+1):
            fn[j]+=fp[i]*gp[j]
    fp=fn
    m*=x

print(f"{sum(fp[i]*i*i for i in range(1,m+1))-sum(fp[i]*i for i in range(1,m+1))**2:.4f}")