我想要做的不完全是高斯分布,因为它有一个有限的最小值和最大值。这个想法更接近于掷 X 骰子并计算总数。
我目前有以下功能:
function bellcurve($min=0,$max=100,$entropy=-1) {
$sum = 0;
if( $entropy < 0) $entropy = ($max-$min)/15;
for($i=0; $i<$entropy; $i++) $sum += rand(0,15);
return floor($sum/(15*$entropy)*($max-$min)+$min);
}
变量背后的想法$entropy
是尝试掷足够多的骰子以获得更均匀的分数结果分布(这样就不会造成问题)。
它不需要是完美的 RNG,它只是用于游戏功能,与赌博或密码学无关。
但是,我在没有参数的情况下对 65,536 次迭代进行了测试bellcurve()
,并出现了以下图表:(来源:adamhaskell.net)
正如您所看到的,有几个值是“偏移”的,而且非常明显。虽然总的来说它并没有真正影响那么大(最坏的情况是它被抵消了 2,并且忽略了概率仍然或多或少在我想要的地方),我只是想知道我哪里出错了。
对此功能的任何其他建议也将不胜感激。
round
更新:我只是通过使用而不是解决了上面的问题floor
,但是我仍然无法为此获得一个好的功能。我已经尝试了几乎所有我能想到的函数,包括高斯、指数、逻辑等,但无济于事。到目前为止唯一有效的方法是这种掷骰子的近似值,这几乎肯定不是我需要的......