此函数是否给出随机数


Does this function give random numbers?

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

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

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

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

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

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