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