【问题标题】:Number of iterations to cover all random numbers覆盖所有随机数的迭代次数
【发布时间】:2015-12-10 04:13:56
【问题描述】:

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

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

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

【问题讨论】:

  • “几乎”到底是什么意思?
  • 我说差不多是因为我不知道它是否涵盖所有内容:)

标签: c random probability


【解决方案1】:

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

对于 Posix,指定序列将以低于 2^32 的句点重复(这是比我的第一点更严格的约束)。

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

参考文献

【讨论】:

  • 请解释否决票。如果您认为有问题,请分享以启发所有人,而不仅仅是您。
  • 我投反对票是因为您的回答不符合我对问题的解释(请参阅 cmets 对 Bathsheba 的回答)。事实上,这个问题是相当模棱两可的。因此,我恢复了反对票。对不起。
【解决方案2】:

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

但是,如果rand() 被实现为具有RAND_MAX周期性 的线性同余生成器(通常如此),rand() 将恢复RAND_MAX 试验中的所有迭代。

【讨论】:

  • 即使使用真正的 RNG,您也只有一组有限的可能值(因为 float 是有限的)。因此,如果您经常尝试,您肯定会获得所有可能的值。
  • 确实如此,但只有在无数次试验之后。该结果与可能值的集合无关,但只有一种可能性的微不足道的情况除外。当然,这仅适用于“真正的”RNG。
  • ...如果您想确保获得了 all 值,可以。但是 OP 是在问“你认为有多少次迭代可以让它涵盖几乎所有的可能性”。我知道他要求的答案是:在 2**64 个样本之后,95% 的把握你已经看到了 90% 的值。但也许我错了。
  • 有点没有意义,因为 LC 生成器将恢复 RAND_MAX 中的所有值。真正生成器的分析更多是一个数学问题:答案是获得某组图纸的概率呈二项分布。
【解决方案3】:

这可能是不可能的。

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

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2012-03-04
    • 2018-02-08
    • 2020-12-20
    • 2023-03-27
    • 2023-03-10
    • 2015-05-05
    • 2016-10-10
    • 1970-01-01
    相关资源
    最近更新 更多