更具体地说,我的问题是,给定无限时间 int(rand()*1000)
最终会命中 0 到 999 之间的每个数字吗? 10^4、10^5 怎么样...我想一旦你达到内存中的大小它肯定会中断,即如果 rand() 返回一个 float ,也就是说内存中的 n 位,你不可能达到更多比 n 个不同的整数,所以一旦你到达 rand()*(2^n+1)
,你肯定会错过一些。
最佳答案
是的,给定无限时间它会击中你范围内的每个数字,前提是它有无限期;一旦再次达到种子值,序列就会重复。当然,正如您提到的那样,您会限制 rand() 返回值的精度,最终您会遇到一个断点,它无法映射到足够大范围内的每个整数。但是,如果您考虑具有无限精度和周期(您提出了无穷大)的理论计算机,那么您将在给定无限时间的情况下命中指定范围内的每个数字。
但是,rand() 使用的 LCG 不会为您提供均匀分布的数字。也就是说,你会以比其他人更高的频率获得一些数字(尽管无限时间你会击中所有因为无穷大就是那么酷)。如果您需要均匀分布,请使用 Mersenne Twister 算法之类的算法。 Boost 库中有一个随机生成器,它具有 Mersenne Twister 并且易于实现。
关于random - rand() 函数有多随机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5913662/