【问题标题】:Generate non-negative random value slightly above or below a number生成略高于或低于数字的非负随机值
【发布时间】: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 万),这会让我窒息报告,因为我的问题中的函数有很多负数。

标签: php math random


【解决方案1】:

限制它:

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

【讨论】:

  • 如果 mt_rand 返回负数,我认为它会返回 null。
【解决方案2】:

试试这个,

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

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

【讨论】:

  • 这总是返回一个大于传递的 $v 的 $tickled 值。我的问题表明需要将加扰的数字随机高于和低于传递的值 - 但不是负数。踢球者正在通过 0.01。我应该得到一些随机性,例如 .009、.02、.011 等。
【解决方案3】:

您必须将-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);

【讨论】:

  • 如果我传递一个小于 0.1 但大于 0 的数字,$tickled 有时仍会返回一个负数。例如,我通过了 0.09,$tickled 变成了 -0.29。
  • @a coder 所以只需附加限制:if ($tickled < 0) $tickled = 0;
  • 我需要它是一个基于传递的 $v 的随机非负数。否则会起作用。
  • 我不明白,你的问题是什么?
  • 抱歉 - 对编辑感到困惑。您更新后的答案中的 $w 是什么?
【解决方案4】:

如果你不太关心随机分布,那么你可以简单地做

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

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

【讨论】:

  • 加扰的数字必须是随机的,而零是一个偶然的随机值,将所有负值都设置为零会达不到目的。
  • 那么你应该遵循我的第二点。您可能需要max 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多