覆盖所有随机数的迭代次数
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
。
参考资料
我阅读了关于如何生成 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
。
参考资料