【发布时间】:2014-06-19 12:33:22
【问题描述】:
我需要稍微打乱报告中的实数。这些值通常在 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。打乱的值需要是非负的,而不是零。踢球者正在通过 0.01。我需要一种将其随机化为 .009、.02、.011 等值的方法——同时继续显着随机化更大的值。
【问题讨论】:
-
$number = mt_rand(0,1000).'.'.mt_rand(0,9).mt_rand(0,9) ?
-
KA,$tickled需要基于传入的值$v,并且需要比较接近$v。正如您在此处建议的那样,我最终可能会得到一个超出范围的随机数。如果我只需要任何随机实数,你的就可以了。
-
为什么不在您的代码中添加
if ($tickled==$v || $tickled < 0)? -
做到了,它适用于一小部分数据(如果为真,只需获取另一个随机值)。如果我传递大量值(例如,100 万),这会让我窒息报告,因为我的问题中的函数有很多负数。