我需要稍微打乱报告中的实数。这些值通常在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。我需要一种方法将其随机化到0.009、0.02、0.011等值,同时继续显著随机化更大的值。
限制:
$tickled = $v + ( mt_rand( $v*(-1), 40) / 100 );
try this,
function tickle_int($v)
{
$random = mt_rand(40, 80);
$tickled = $v + (($random - 40) / 100);
if ($tickled==$v)
{
$tickled = tickle_int($v);
}
print_r($tickled);
}
您必须将-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);
如果您不太关心随机分布,那么您可以简单地执行
if ($tickled < 0)
{
$tickled = 0;
}
return $tickled;
否则,需要修改传递给mt_rand
的最小参数,使其依赖于$v