【问题标题】:I do not understand the PHP "Daily quote" tutorial不懂PHP“每日报价”教程
【发布时间】:2010-12-06 16:29:09
【问题描述】:

this tutorial的每日灵感部分他说:

$quote = array(
1 => "Quote 1",
2 => "Quote 2",
3 => "Quote 3",
4 => "Quote 4",
5 => "Quote 5",
);
srand ((double) microtime() * 1000000);
$randnum = rand(1,5);
echo"$quote[$randnum]";

我不明白他在这里做什么(字面意思):

srand ((double) microtime() * 1000000);

你能帮我理解这是做什么的吗?

我知道srand() 是:

播种随机数生成器

但是他为什么要这样做,有什么意义呢?

顺便说一句:我会选择这样的:

<?php

$quotes = array(

"one",
"two",
"three"

);

echo $quotes[rand(0,count($quotes)-1)];
?>

这有什么问题吗?

【问题讨论】:

  • 这只是关于是否真的随机的事情......capuzza.com/detail.php?ID=115293
  • @andre matos 来自 2007 年,我看起来不再需要它了:stackoverflow.com/questions/4368616/… 谢谢!!
  • 你说得对,但这就是我所知道的一切(这里真的过时了!!)。这就是为什么我发表评论而不是真正的答案!我现在感觉豁然开朗了! :-)

标签: php random seed


【解决方案1】:

大多数随机数生成器aren't actually random;他们生成的下一个数字是使用一个简单而大的函数从先前生成的数字中计算出来的。播种 RNG 会给它一个“以前的”编号来工作,因为很多时候它们每次都从相同的已知状态开始。

【讨论】:

    【解决方案2】:

    在 PHP 4.2 之前,您需要“播种”随机发生器以使其真正成为“随机”。现在播种随机数是没有意义的。

    文档状态:

    注意:从 PHP 4.2.0 开始,没有 需要播种随机数 带有 srand() 或 mt_srand() 的生成器 因为这现在是自动完成的。

    见:http://php.net/manual/en/function.srand.php

    您的解决方案同样有效。

    【讨论】:

    • @Darryl E. Clarke,所以,底线,不再需要!谢谢!
    • 无论是否指定种子,在任何 PHP 版本(或任何其他语言,就此而言)你永远不会有随机数,因为它们总是以确定性的方式从种子派生而来。
    • @nico 真的!谢谢!在这里了解到:) stackoverflow.com/questions/3956478/understanding-randomness
    • @nico - 同意。但这不是这里真正的主题。
    • @Darryl E. Clarke:当然,我只是指出(暂时忘记了 PHP 版本之间的差异)调用srand 后生成的数字不超过或不低于随机数那些在没有调用srand 的情况下生成的。事实上,术语伪随机应该是首选。
    【解决方案3】:

    调用srand() 背后的想法是提供“更好”的随机数。但调用srand() 带来“更多随机”数字并不一定是真的。由于PHP 4.2 没有必要调用srand(),因为PHP 会在内部进行。

    【讨论】:

      【解决方案4】:

      这只是一个 20 年前的教程中的神器(使用另一个!):

      • 随机数生成器已经自动很久了seeded
      • mt_rand 应该优先于 rand,因为它更快且“更随机”(即它提供更多程度的无偏随机变量)

      PS:我建议在这里使用array_rand,因为您不需要关心确切的键。

      echo $quotes[array_rand($quotes)];
      

      【讨论】:

      • 是的,知道它已经过时了。感谢mt_rand!!
      • @Trufa: @BTW: 你的代码比他们的要好得多。使用 0 索引数组肯定更好,使用更通用的 length 也更好。但正如我在帖子中所指出的,您甚至可以使用array_rand 使其更通用;)
      • 看起来更好,而且是一个很好的捷径,谢谢!!但我无法通过you will need to change the 5 in the script 得到你的建议,我需要改变什么?再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      相关资源
      最近更新 更多