0

问题可能是题外话,但我只是想知道这是否不是一个不错且简单的随机数函数。它应该给出一个从 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
)

我问这个问题的原因是:我读到不可能创建一个真正的随机数,所以我开始思考,这个函数似乎给出了相当随机的结果,一点也不复杂。那么我在这里错过了什么吗?

4

1 回答 1

1

这还不够伪随机,不能被认为是可接受的随机。

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

虽然它可能是一个简单的解决方案,而且它可能会为您提供随机数,但您可能会在特定于您的应用程序生成的聚合数据中发现奇怪之处。例如,如果您正在为《大富翁》这样的游戏生成掷骰,同时掷出两个骰子,您可能会发现掷骰子的发生率比通常情况下要高。我不能说您的特定算法会导致这个特定问题。这只是您使用自己的随机数生成例程可能遇到的异常类型的一个示例。

我可以特别说的一件事是,您生成的值是基于生成时当前的微秒数。如果您在几毫秒内生成两个值,结果将就在附近。典型的随机数生成器为生成器提供一个值(通常从当前时间开始),但从该点开始,每次调用生成另一个数字时,只需提供由种子开始的随机序列中的下一个值。您获得的号码不取决于时间,除非您在每次通话时重新设定生成器的种子。但是,此元素存在于您的日常生活中,也可能是不良副作用的根源。

于 2013-10-24T14:08:51.073 回答