覆盖所有随机数的迭代次数

Number of iterations to cover all random numbers

我阅读了关于如何生成 0 到 1 之间的随机数的各种问题的答案。

float random = ((float) rand()) / (float) RAND_MAX;

现在我很好奇。考虑到生成器会重复数字(对于真正的随机数),您认为多少次迭代可以使其涵盖几乎所有可能性。 我用 C 编写代码并使用 gcc 编译器。

如果它是一个 true 随机数生成器(即抽到给定数字的概率是 1 / RAND_MAX 并且独立于之前抽到的一组数字),那么你需要无限次迭代才能涵盖所有可能性。

rand() 然而,如果将其实现为具有 RAND_MAX 周期性 的线性同余生成器(如它经常是)。

估计是没法说了

确定它的唯一接近方法是 运行 测试(使用随机函数直到找到所有值),并计算迭代次数。然后你做很多次并确定平均值...

rand() 函数使用了一些内存。如果它使用 b 位内存,那么它不能有超过 2^b 个不同的状态。这意味着序列将以低于 2^b.

的周期重复

对于 Posix 指定序列将 以低于 2^32 的周期重复(这是比我的第一点更严格的限制) .

现在,如果您只对包含至少两倍相同数字的序列的长度感兴趣,那么由于鸽巢原理,它显然是 RAND_MAX+1

参考资料