如果 srand() 采用 32 位 int... 为什么 rand() 不 return 相同?
If srand() takes 32-bit int... Why does rand() not return same?
跨平台,标准rand()
的局限性在于你只能依赖它来生成16位short
s ...你可以从这些位移位来创建更长的数字,但这很不方便。
为什么尽管 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 一个介于 0
和 RAND_MAX
之间的 32 位值。
INT_MAX
和 RAND_MAX
的解耦(即标准不要求它们相等,但也不阻止它们)只是让供应商可以自由地实现它们 srand()
和 rand()
。然后,不同的供应商出于自己的原因(商业、技术等)做出不同的选择。
PRNG 的范围 与其周期 无关。 范围是它可以return的一组数字:一个16位PRNG returns只有16位数字;也就是说,值 0..65535.
PRNG 的 period 是在其序列重复之前可以调用多少次,对我而言,您通常希望它比范围大得多——理想情况下您希望那是无限的,但实际上我们受到计算机内存量的限制。
PRNG 的周期受其内部状态大小的限制。如果该内部状态是 32 位,那么 PRNG 的周期不会超过 40 亿左右,并且只有 40 亿个不同的种子。像 Mersenne Twister 这样的东西有一个超过 2400 字节的内部状态,因此一个非常大的周期,如果你愿意,可以用所有这些 2400+ 字节作为种子。
跨平台,标准rand()
的局限性在于你只能依赖它来生成16位short
s ...你可以从这些位移位来创建更长的数字,但这很不方便。
为什么尽管 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 一个介于 0
和 RAND_MAX
之间的 32 位值。
INT_MAX
和 RAND_MAX
的解耦(即标准不要求它们相等,但也不阻止它们)只是让供应商可以自由地实现它们 srand()
和 rand()
。然后,不同的供应商出于自己的原因(商业、技术等)做出不同的选择。
PRNG 的范围 与其周期 无关。 范围是它可以return的一组数字:一个16位PRNG returns只有16位数字;也就是说,值 0..65535.
PRNG 的 period 是在其序列重复之前可以调用多少次,对我而言,您通常希望它比范围大得多——理想情况下您希望那是无限的,但实际上我们受到计算机内存量的限制。
PRNG 的周期受其内部状态大小的限制。如果该内部状态是 32 位,那么 PRNG 的周期不会超过 40 亿左右,并且只有 40 亿个不同的种子。像 Mersenne Twister 这样的东西有一个超过 2400 字节的内部状态,因此一个非常大的周期,如果你愿意,可以用所有这些 2400+ 字节作为种子。