一次丢5颗骰子,怎么快速计算骰子点数和的概率分布?

如果将5颗推广至n颗,有什么计算公式。可以尝试用编程来解决,或者用概率论与数理统计的知识解决,最好给出推理过程。


丢一颗骰子,结果的分布列为[0,1,1,1,1,1,1]/6(下标从0开始)。

丢n颗骰子,结果的分布列为n个上述分布列的卷积。

卷积可以用傅里叶变换快速计算:n个相同分布列的卷积,在频域就是该分布列频谱的n次方。

Matlab代码:

n = 100;
p = zeros(6 * n + 1, 1); % 掷n颗骰子,最大总点数为6n
p(2:7) = 1/6;
q = ifft(fft(p) .^ n); % 这就是n颗骰子总点数的分布列,会有微小的浮点误差


可以用母函数啊,(x + x^2 + x^3 + x^4 + x^5 + x^6)^n展开之后对应幂次的系数就是出现的这个和的可能情况的总数,代入x=1可以得到所有系数的和是6^n,所以折合成概率就是

frac{(x + x^2 + x^3 + x^4 + x^5 + x^6) ^ n}{6^n}

可以变形写成

frac{x^n(x^6 - 1)^n}{6^n(x-1)^n}

或者

frac{x^nprod_{k=1}^5(x - e^{ifrac{kpi}{3}})^n}{6^n}

或者

frac{x^n(x+1)^n(x^2 - x+1)^n(x^2 + x +1)^n}{6^n}

后面两种形式用程序展开应该不难。

当然,FFT也是极好的,复杂度只有O(nlogn)。


可以转移概率矩阵

计算第n次转移的概率

function [ out ] =get_dice_trans_mat( n )

r = 5*(n-1)+1;

c = 5*n+1;

out = zeros(r,c);

for i = 1 : r

for j = 1 : c

if(j-i &< 6 j &>=i)

out(i,j) = 1/6;

end

end

end

end

主程序:

clear;

clc;

t = 10;

res = 1;

for i = 1:t

res = res*get_dice_trans_mat( i );

end


推薦閱讀:

N個隨機變數之間的相關性兩兩小於0.7 ?
P值與α值的關係?
一條長度為一的線段隨機分成五份,其中至少有一份>四分之一的幾率是多少?
人類行為服從的冪律分布是否違背了中心極限定理?
概率論問題:邏輯上說不通?

TAG:数学 | 编程 | 概率论 | 骰子 | 概率论与数理统计 |