PHP 随机浮点数生成器


PHP Random Float Number Generator

我是PHP的新手,很抱歉,如果这很混乱,我已经环顾了StackOverflow,但我找不到任何适合我需要的东西。

我正在尝试创建一个随机浮点数列表。但是我遇到的问题是每次我运行列表时,它都会打印出相同的数字。谁能解释为什么以及是否有办法在每次迭代中获得不同的数字。

谢谢你的任何帮助。

<?php
    function frand($min, $max, $decimals = 0) {
        mt_srand(microtime());
        $scale = pow(10, $decimals);
        return mt_rand($min * $scale, $max * $scale) / $scale;
    }
    for ($x = 1; $x <= 45; $x++) {
        echo frand(1, 17, 8) . "<br/>";
    } 
?>

您应该在脚本中只使用一次mt_srand(microtime());函数。

请注意,您的代码肯定会比 1 微秒更快运行。因此,microtime()将返回相同数量的微秒,mt_srand将生成相同的种子,这将影响相同的mt_rand结果。

请尝试改用以下代码:

<?php
  function frand($min, $max, $decimals = 0) {
      $scale = pow(10, $decimals);
      return mt_rand($min * $scale, $max * $scale) / $scale;
  }

  mt_srand(microtime());
  for ($x = 1; $x <= 45; $x++) {
      echo frand(1, 17, 8) . "<br/>";
  } 
?>

您应该只调用srand()mt_srand()一次。他们初始化随机数生成器。您的代码在每次调用mt_rand()之前调用它,并且由于函数frand()需要远小于一微秒才能完成,因此每次都使用相同的值初始化随机数生成器。

正如文档所说,没有必要调用mt_srand()因为PHP解释器会为您完成。

需要调用mt_rand()的唯一情况是,您特别需要始终获取相同的随机数序列;在这种情况下,您需要使用受控值来初始化它,而不是当前时间。

尝试这样做

function frand($min, $max, $decimals = 0) {
$scale = pow(10, $decimals);
return mt_rand($min * $scale, $max * $scale) / $scale;
}
for ($x = 1; $x <= 45; $x++) {
echo frand(1, 17, 8) . "<br/>";
} 
mt_srand(microtime());