我需要在报告中略微加扰实数。这些值通常在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等值,同时继续显着随机化较大的值。
答案 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
。