如果 srand() 采用 32 位 int... 为什么 rand() 不 return 相同?

If srand() takes 32-bit int... Why does rand() not return same?

跨平台,标准rand()的局限性在于你只能依赖它来生成16位shorts ...你可以从这些位移位来创建更长的数字,但这很不方便。

为什么尽管 rand() 有效 returns 最多 16 位值,srand() 需要 32 位 int 来播种相同的进程?

INT_MAX 的值(int 支持的实现定义的最大值)也不保证大于 32767。实际上,这意味着 int 不能保证超过 16 位(虽然标准没有这么说,但可以推断值 32767 可以用 16 位来表示。

这意味着你的问题的基本前提是错误的。该标准要求 srand() 接受 int 种子,并且 rand() return 是 int 值。

如果编译器提供 32 位 int(这不是必需的,但标准允许),那么 srand() 将接受 32 位种子,并且 rand() 将 return 一个介于 0RAND_MAX 之间的 32 位值。

INT_MAXRAND_MAX 的解耦(即标准不要求它们相等,但也不阻止它们)只是让供应商可以自由地实现它们 srand()rand()。然后,不同的供应商出于自己的原因(商业、技术等)做出不同的选择。

PRNG 的范围 与其周期 无关。 范围是它可以return的一组数字:一个16位PRNG returns只有16位数字;也就是说,值 0..65535.

PRNG 的 period 是在其序列重复之前可以调用多少次,对我而言,您通常希望它比范围大得多——理想情况下您希望那是无限的,但实际上我们受到计算机内存量的限制。

PRNG 的周期受其内部状态大小的限制。如果该内部状态是 32 位,那么 PRNG 的周期不会超过 40 亿左右,并且只有 40 亿个不同的种子。像 Mersenne Twister 这样的东西有一个超过 2400 字节的内部状态,因此一个非常大的周期,如果你愿意,可以用所有这些 2400+ 字节作为种子。