PHP随机浮点数生成器

PHP随机浮点数生成器,php,random,Php,Random,我是新来PHP的,所以很抱歉,如果这是混乱的,我已经环顾了StackOverflow,但我找不到任何适合我需要的东西 我正在尝试创建一个随机浮点数列表。但我遇到的问题是,每次我运行列表时,它都会打印出相同的数字。有人能解释一下为什么每次迭代都有不同的数字吗 谢谢你的帮助 <?php function frand($min, $max, $decimals = 0) { mt_srand(microtime()); $scale = pow(10,

我是新来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\u srand
将生成相同的种子,这将对
mt\u 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/>";
  } 

?>

您应该使用
mt_srand(microtime())在脚本中只运行一次

请注意,您的代码运行速度肯定会超过1微秒。因此,
microtime()
将返回相同数量的微秒,
mt\u srand
将生成相同的种子,这将对
mt\u 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/>";
  } 

?>

像这样试试

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());
函数frand($min、$max、$decimals=0){ $scale=pow(10,$decimals); 返回mt_rand($min*$scale,$max*$scale)/$scale; } 对于($x=1;$x请这样尝试

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());
函数frand($min、$max、$decimals=0){ $scale=pow(10,$decimals); 返回mt_rand($min*$scale,$max*$scale)/$scale; }
对于($x=1;$x您应该只调用
srand()
mt\u srand()
一次。它们初始化随机数生成器。您的代码在每次调用
mt\u rand()
之前调用它,因为函数
frand()
只需不到一微秒的时间即可完成,每次都用相同的值初始化随机数生成器

正如前面所说,不需要调用
mt_srand()
,因为PHP解释器会为您执行此操作


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

您应该调用
srand()
mt_-srand())
仅一次。它们初始化随机数生成器。在每次调用
mt_rand()
之前,您的代码都会调用它,因为函数
frand()
需要不到一微秒的时间才能完成,所以您每次都用相同的值初始化随机数生成器

正如前面所说,不需要调用
mt_srand()
,因为PHP解释器会为您执行此操作


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

@GavW让我知道它是否对you@GavW是的,我也很好奇,因为php运行的是
mt_srand()
在脚本的开头。如果没有最后一行,您的代码也能正常工作。@GavW请告诉我它对脚本是否有用you@GavW是的,我也很好奇,因为php运行的是
mt_srand()
在脚本的开头。如果没有最后一行,您的代码也能正常工作。感谢您提供的有用建议。感谢您提供的有用建议。