1

我想要做的不完全是高斯分布,因为它有一个有限的最小值和最大值。这个想法更接近于掷 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,但是我仍然无法为此获得一个好的功能。我已经尝试了几乎所有我能想到的函数,包括高斯、指数、逻辑等,但无济于事。到目前为止唯一有效的方法是这种掷骰子的近似值,这几乎肯定不是我需要的......

4

2 回答 2

1

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

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

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

于 2012-08-02T19:10:35.780 回答
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%
于 2012-08-03T01:05:12.043 回答