PHP随机浮点数生成器

时间:2015-01-12 09:21:28

标签: php random

我是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/>";
    } 
?>

3 个答案:

答案 0 :(得分:3)

您应该只在脚本中使用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/>";
  } 

?>

答案 1 :(得分:2)

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

正如documentation所说,没有必要调用mt_srand()因为PHP解释器会为你做这件事。

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

答案 2 :(得分:0)

试试这个

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());