【发布时间】:2023-07-19 10:44:01
【问题描述】:
受General purpose random number generation 的启发,我决定执行自己的测试,看看 rand() 出了什么问题。使用这个程序:
srand(time(0));
for (int i = 0; i < 1000000; ++i)
{
std::cout << rand() % 1000 << " ";
}
我使用以下命令在 Octave 中加载它:
S = load("test.txt")
hist(S)
得到了这个结果:
对我来说,结果似乎很统一。我预计结果会更加偏斜。我做错了测试吗?
【问题讨论】:
-
rand 主要是不好的,因为:
RAND_MAX是实现定义的,例如在 Visual Studio 上它只是 2^16; rand 是全球性的,这意味着如果您以外的其他人调用 srand 它可能会搞砸您的代码。如果您有 C++11 编译器,请考虑使用其 RNG 之一 -
根据实现的不同,
rand()可以在其低位上具有低熵。如果你做了rand() % 4,在某些实现中这是非常不统一的。这就是为什么在这种情况下通常建议(如果你使用rand())写rand() / (RAND_MAX / 4)。 -
rand() 真的那么糟糕吗? 是的!
-
虽然看起来是均匀的,但对于除 2 的幂之外的任何区间宽度,您都不会得到真正的均匀性。数学很简单..
-
@Creris 在 MSVC
RAND_MAX上是 (2^15-1),而不是 2^16。因此,您甚至无法通过 2 个rand()调用获得 32 位 int。当您必须运行 2 次调用以获取随机 int 时,在 Linux 中也是如此