跨平台,标准rand()
的限制是您只能依靠它来生成16位short
...您可以通过位移来从这些中创建更长的数字,但它是给您带来不便。
为什么rand()
只有有效返回最多16位值,srand()
需要 32位{{1播种同样的过程?
答案 0 :(得分:3)
INT_MAX
(int
支持的实现定义的最大值)的值也不保证大于32767
。实际上,这意味着int
不能保证超过16位(尽管标准没有说明,可以推断值32767
可以用16位表示。
这意味着你的问题的基本前提是错误的。该标准要求srand()
接受int
种子,并rand()
返回int
值。
如果编译器提供32位int
(这不是必需的,但标准允许),那么srand()
将接受32位种子,rand()
将返回0
和RAND_MAX
之间的32位值。
INT_MAX
和RAND_MAX
的解耦(即标准不要求它们相等,但也不能阻止它)只是让供应商自由地实现它们{{1 }和srand()
。然后,不同的供应商出于自己的原因(商业,技术等)做出不同的选择。
答案 1 :(得分:0)
PRNG的范围独立于期间。 范围是它可以返回的一组数字:一个16位PRNG只返回16位数字;即值0..65535。
PRNG的期间是它在序列重复之前可以被调用的次数,并且你通常希望它比我的范围大得多 - 理想情况下你希望它是无限的,但实际上我们受到计算机内存量的限制。
PRNG的期限受其内部状态的大小限制。如果该内部状态是32比特,那么PRNG的周期可以不超过40亿左右,并且只有40亿个不同的种子。像Mersenne Twister这样的内部状态超过2400字节,因此是一个非常大的时间段,如果你想要的话,可以用所有这些2400+字节播种。