我正在尝试计算不断变化的 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 for 循环使用底数和模数函数的魔力来创建一个以 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 个可能的结果,并将 1 添加到 $distribution 数组中 3 到 18 之间的相应槽。非常简单。然而,它只工作到大约 8d6,之后我得到服务器超时,因为它现在正在进行数十亿次计算。
但我认为没有必要,因为死亡概率遵循甜美的钟形曲线分布。我想知道是否有办法跳过数字运算并直接进入曲线本身。有没有办法做到这一点,例如,80d6(范围:80-480)?可以在不进行 6^80 计算的情况下预测分布吗?
我不是专业的编码员,概率对我来说还是个新手,所以感谢所有帮助!
斯蒂芬