RNG高斯分布

时间:2012-08-02 15:26:56

标签: php gaussian prng

我尝试做的事情并不完全是高斯分布,因为它具有有限的最小值和最大值。这个想法更接近滚动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()次迭代测试,并出现了以下图表:
Graph http://adamhaskell.net/img/badentropy.png

正如您所看到的,有几个值是&#34;偏移&#34;,并且非常明显。虽然总的来说它并没有真正影响那么多(最坏的情况是它偏移2,而忽略了概率仍然或多或少地在我想要的地方),我只是想知道我去了哪里错。

对此功能的任何其他建议也将受到赞赏。

更新:我使用round代替floor解决了上述问题,但我仍然无法为此获得良好的功能。我几乎尝试过我能想到的所有功能,包括高斯,指数,逻辑等,但无济于事。到目前为止唯一有效的方法是滚动骰子的近似,这几乎肯定不是我需要的......

2 个答案:

答案 0 :(得分:1)

如果您正在寻找钟形曲线分布,请生成多个随机数并将它们相加。如果您正在寻找更多修饰符,只需将它们乘以最终结果即可。

生成随机钟形曲线编号,奖励为50% - 150%。 总和(兰特(0,15),兰特(0,15),兰特(0,15))*(兰特(2,6)/ 2)

虽然如果你担心rand没有提供足够随机的数字,你可以使用mt_rand,这将有更好的分布(使用mersenne twister)

答案 1 :(得分:0)

主要问题是我试图根据离散变量生成连续钟形曲线。这就是在缩放结果时导致漏洞和偏移的原因。

我用于此的修复是:+rand(0,1000000)/1000000 - 它基本上采用整数离散变量并向其添加随机分数,或多或少使其连续。

现在的功能是:

function bellcurve() {
    $sum = 0;
    $entropy = 6;
    for($i=0; $i<$entropy; $i++) $sum += rand(0,15);
    return ($sum+rand(0,1000000)/1000000)/(15*$entropy);
}

它返回一个介于0和1之间的浮点数(虽然这些确切的值极不可能),然后可以根据需要进行缩放和舍入。

使用示例:

$damage *= bellcurve()-0.5; // adjusts $damage by a random amount
                            // between 50% and 150%, weighted in favour of 100%