【问题标题】:Criteria for being an effective pseudo-random generator成为有效伪随机发生器的标准
【发布时间】:2020-09-24 19:36:58
【问题描述】:

我实现了一个类,它采用两个(随机)uint32_t 值,并生成周期为 2^64 - 1 的伪随机 uint64_t 数字。我生成了 500,000,000 个数字,我可以看到:

  • [0; 的每个百分位数; 2^64 - 1] 占所有数字的 1%,精度至少为 10^-8。
  • 对于 [2; 101],可被 k 整除的数字的比例为 1/k,精度至少为 10^-4,其中大多数为 10^-5。
  • 没有两个数字具有相同的值。

这些标准是否足以说我的发电机是“好”的?

【问题讨论】:

  • 你希望它是加密安全的吗?
  • 没有两个具有相同值的数字对于一个好的 rng 来说是一件坏事,而不是一件好事。
  • @Aplet123 根据en.wikipedia.org/wiki/Birthday_problem 使用公式sqrt(2*2^64*ln(2)),您预计在得到重复之前必须生成 50 亿个数字
  • 我同意 No two numbers having the same value 不应该是 RNG 的目标,但如果您生成的数字集明显小于可能的范围,The same number not being generated more often than the probability would lead you to expect 的有效目标会导致相同的结果数字。

标签: c++ random generator


【解决方案1】:

这些标准是否足以说我的发电机是“好”的?

有完善的测试可以运行和验证您的 PRNG:

我建议查看PCG64,并尝试将您的代码与它进行比较,运行上述相同的统计测试,测量速度等。

【讨论】:

  • 谢谢。我很想使用 PCG,但这个示例对我来说非常神秘。我希望他们只是使用 RNG 类实现了一个模板函数,并像那样测试它。
  • @Pippin 我要求不要使用 PCG64(当然,如果你愿意,你可以使用它),但是看看 PCG64 的测试是如何完成的,你如何调整它们以适应你的 RNG 以及如何它们具有可比性。 PCG64 是一种最小的可接受(按照今天的规范)RNG,质量合理,速度快,内存使用量小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2011-02-08
  • 2015-08-07
  • 2012-02-12
  • 1970-01-01
  • 2011-01-10
相关资源
最近更新 更多