这个函数是否给出随机数?

时间:2013-10-24 13:56:08

标签: php random

问题可能不是主题,但我只是想知道这是不是一个漂亮而简单的随机数函数。它应该给出一个从0到$max的随机数:

function randomNumber($max){
  ((int)(1000000000000 / microtime())) % ($max+1);
}

如果我没有遗漏一些非常明显的东西,这应该有用,不应该吗?但是,接下来的问题是:这里创建的数字是否真的随机?当我模拟1'000'000骰子卷时,我会得到如下内容:

Array
(
    [1] => 166520
    [2] => 166619
    [3] => 166522
    [4] => 167001
    [5] => 166512
    [6] => 166826
)

为什么我问这个问题是:我已经读过,创建一个真正随机的数字是不可能的,所以我开始思考,这个函数似乎给出了相当随机的结果,而且根本不复杂。我在这里错过了一些东西吗?

1 个答案:

答案 0 :(得分:1)

这不是伪随机足以被视为可接受的随机。

请记住,使用随机数生成器生成的偶数并非真正随机。它们只是伪随机的,当需要随机数时可以使用它们。他们仍然遵循一种模式,虽然是一种非常复杂的模式。

虽然它可能是一个简单的解决方案,并且它似乎可以为您提供随机数,但您可能会发现特定于您的应用程序生成的聚合数据存在奇怪之处。例如,如果您为像Monopoly这样的游戏生成卷,同时生成两个骰子卷,您可能会发现滚动双打的发生率高于典型值。我不能说你的具体算法会导致这个特定的问题。这只是您使用自己的随机数生成例程可能遇到的异常类型的一个示例。

我可以具体说明的一点是,您生成的值基于生成时的当前微秒数。如果您在几毫秒内生成两个值,则结果将在附近。典型的随机数生成器使用一个值(通常来自当前时间)为生成器播种,但是从每次调用的那一点开始生成另一个数字只是提供种子开始的随机序列中的下一个值。除非您在每次调用时重新启动发生器,否则您获得的数量不依赖于时间。但是,这个元素存在于您的日常生活中,也可能是不良副作用的来源。