我正在尝试计算不断变化的6面骰子投掷次数的概率分布。例如,3d6范围从3到18如下:
3:1, 4:3, 5:6, 6:10, 7:15, 8:21, 9:25, 10:27, 11:27, 12:25, 13:21, 14:15, 15:10, 16:6, 17:3, 18:1
我编写了这个PHP程序来计算它:
function distributionCalc($numberDice,$sides=6) {
for ( $i=0; $i<pow($sides,$numberDice); $i++)
{
$sum=0;
for ($j=0; $j<$numberDice; $j++)
{ $sum+=(1+(floor($i/pow($sides,$j))) % $sides); }
$distribution[$sum]++;
}
return $distribution;
}
内部的$j$循环利用了floor和modulus函数的魔力,创建了一个基于6的计数序列,其数字数量为骰子的数量,因此$3d6$将被计算为:
111,112,113,114,115,116,121,122,123,124,125,126,131,etc.
该函数将每个数字求和,因此它会读作:3,4,5,6,7,8,4,5,6,7,8,9,5等。它会遍历所有6^3种可能结果,并在3到18之间的$分布数组中添加1以对应槽位进行计算。相当简单直接。然而,在8d6左右时,它只能工作一段时间,之后我会因为进行了数十亿次计算而出现服务器超时。
但是我不认为这是必要的,因为骰子概率遵循一个甜美的钟形曲线分布。我想知道是否有一种方法可以跳过繁琐的计算直接进入曲线本身。例如,是否可以在80d6(范围:80-480)中实现这一点?是否可以在进行6^80次计算之前预测分布情况?
我不是专业的编码人员,概率对我来说还很新颖,所以感谢您的所有帮助!
Stephen