【问题标题】:How to test if a non-repeated random name generator was implemented correctly?如何测试非重复随机名称生成器是否正确实现?
【发布时间】:2021-12-20 14:51:33
【问题描述】:

我的目标是为编程练习实施测试。该练习需要一种方法来生成两个大写字母和三个数字的随机组合(按此顺序,例如:QF354)。组合必须是随机且不重复的。

如何测试方法是否正确实现?

我正在考虑生成一组样本并检查是否有任何重复值,但排列的数量太大(p = 26*26*10*10*10 = 676000),无法进行快速测试。

我不知道我的样本组应该有多大才能确认(至少有很高的信心)这些值是不重复的。也欢迎替代品。

【问题讨论】:

  • 您可以应用与此处相同的技术stackoverflow.com/questions/2130621/…
  • @ArthurKlezovich 这似乎没有测试不重复?
  • 您需要确定多少?查看Birthday problem 并自行计算样本量和概率之间的关系。
  • @OleV.V.我在 1980 年代与人合着了一篇论文,应用该概念来构建一个简单的 PRNG 独立性测试,该测试输出其整个状态(几乎是 1980 年代的所有 PRNG)。如果有poolsize 可能的值并且您没有看到3*sqrt(poolsize) 的任何重复值,则非独立概率> 0.99。但是,这不能翻转以检查是否不会重复,因为cycle_length > 3*sqrt(poolsize) 可能存在循环。您提到的计算假设独立且均匀分布的结果。
  • 在 676000 种可能性中,您实际上要生成多少种?

标签: java testing random sample


【解决方案1】:

@OleV.V. material you suggested 足以让我找到解决方案。

这是我使用的近似值:

p(n,d) = 1 - e^(-(n²/2d);

其中 n 是总体规模,d 是样本规模。

对于我的问题,在大约 5000 个样本时,碰撞概率逐渐达到 1。我用几种不同的解决方案做了一些测试,到目前为止所有结果都符合预期。

感谢cmets!

【讨论】:

  • 虽然您的答案可能是正确的,但在夜间模式下无法阅读,因为您的公式在这里是深灰色上的黑色。请编辑!
  • Ty,刚刚编辑过。
  • 我关心的是您是否可以证明您的方法实现了 676000 的完整循环。如果您的算法产生两个长度为 338000 的子循环,或四个长度为 169000 的子循环,或者...,那么您早在你达到 676000 之前,你可能会遇到一个令人讨厌的惊喜。即使数学是正确的,如果一个完整周期的基本假设是错误的,你就会遇到问题。这就是为什么我在对该问题的评论中询问您实际需要多少值的部分原因
猜你喜欢
  • 2011-07-03
  • 2018-09-26
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 2010-12-04
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多