生成略高于或低于数字的非负随机值

时间:2014-06-19 12:33:22

标签: php math random

我需要在报告中略微加扰实数。这些值通常在0到1000之间,大多数是包含小数位数为2的小数字。

一些例子:

32.1
0.10
0.02
0.01

我把这个简单的函数放在一起稍微加扰值:

function tickle_int($v)
{
    $tickled = $v + (mt_rand(-40, 40) / 100);

    if ($tickled==$v)
    {
        $tickled = tickle_int($v);
    }
    return $tickled;
}

但我发现返回的值通常是负数。如果我将mt_rand的低值更改为0,我只会获得大于原始值的加扰值,从而降低随机性。

如何修改此函数以仅返回随机输入上方或下方的非负值?

编辑添加我需要避免0.加扰值必须是非负值而不是零。踢球者正在传球.01。我需要一种方法将其随机化为诸如.009,。02,。011等值,同时继续显着随机化较大的值。

4 个答案:

答案 0 :(得分:1)

您必须将-40移到mt_rand之外:

function tickle_int($v, $w)
{
    $tickled = $v + (mt_rand(0, 2 * $w) - ($v >= $w? $w : $v)) / 100;

    if ($tickled==$v)
    {
        $tickled = tickle_int($v);
    }
    return $tickled;
}

tickle_int(0.5, 40);

答案 1 :(得分:1)

限制它:

$tickled = $v + ( mt_rand( $v*(-1), 40) / 100 );

答案 2 :(得分:1)

试试这个,

function tickle_int($v)
{
    $random = mt_rand(40, 80);
    $tickled = $v + (($random - 40) / 100);

    if ($tickled==$v)
    {
        $tickled = tickle_int($v);
    }
    print_r($tickled);
}

答案 3 :(得分:0)

如果您对随机分布不太关心,那么您可以简单地进行

if ($tickled < 0)
{
    $tickled = 0;
}
return $tickled;

否则,您需要修改传递给mt_rand的min参数,使其依赖$v