random - rand() 函数有多随机?

标签 random

更具体地说,我的问题是,给定无限时间 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/

相关文章:

jquery - 将随机类应用于指定的每个元素

python - 生成 numpy 数组或随机分布的 0 和 1 的最快方法

python - python中多个列表的高效排列

c++ - boost.random buggy 警告 - 这是什么意思?

java - Random without duplicate using stream和关于sort Java的问题

java - java中具有固定平均值的随机整数数组

random - 从 32 位有限集生成伪随机非重复整数

c# - 如何从种子中生成随机的人类可读颜色? C#

ruby - 如何在避免每个切片中出现重复值的同时对数组进行切片?

MATLAB 向量 : prevent consecutive values from same range