【问题标题】:Is the following random number generation without bias?下面的随机数生成是否没有偏差?
【发布时间】:2012-10-22 06:24:49
【问题描述】:

下面的代码会产生一个有或没有偏差的随机数吗?

    int numberToGenerate = 20;
    int rangeUpperLimit = 30;
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

    for (int i = 0; i < numberToGenerate; i++) {
        int randomInt = random.nextInt(rangeUpperLimit); 
        // Do something with it.
    }        

这些值用于从长度为 30 的 String 中选择 chars,因此范围为 0-29。选择char 值的代码被省略,因为它与问题无关。

【问题讨论】:

  • 您对异常的第一条评论是什么意思?另请注意,nextInt 已经有一个专属上限,因此您应该只使用rangeUpperLimit
  • 删除了这些并修复了代码。谢谢。
  • 首先,java或者其他任何语言,都不产生随机数,它是伪随机的。因为随机类也使用一些逻辑来产生这些数字,所以它不是真正随机的。仅供参考。

标签: java security random


【解决方案1】:

意味着是均匀分布(因此没有偏差)。来自the documentation

返回一个伪随机、均匀分布的 int 值,介于 0(含)和指定值(不含)之间,取自此随机数生成器的序列。

假设生成器序列是好的,但我认为这是一个合理的假设,特别是考虑到SecureRandom 的文档:

加密强随机数至少符合 FIPS 140-2,加密模块的安全要求,第 4.9.1 节中指定的统计随机数生成器测试。

如果您担心偏差,那么检查任何特定运行将相当容易 - 生成(例如)三千万个值,跟踪您获得每个数字的次数,并查看它与一个数字的接近程度每桶百万。

【讨论】:

  • 简明扼要且内容丰富的回复。我很可能会测试这一代,以及一种在一定程度上保证不会产生一组带有偏见的数字的方法。现在让我想一个有效的方法来做到这一点:) 再次感谢。
【解决方案2】:

根据documentation 的定义,结果应该足够统一,但在您的示例中,您没有使用种子来初始化 PNRG,因此它可能存在偏差。

【讨论】:

  • 为什么不使用种子会引入偏见?无论如何,您所说的“主要有偏见”是什么意思? (另请注意,这里是SecureRandom,可以使用各种方法获得好种子。)
  • 因为sun.security.provider.SecureRandom 内部使用的算法没有经过全面测试。在这种情况下拥有一个真正的不可预测性来源有助于避免任何潜在的问题。大多数不是正确的术语,我会说可能。
  • 我仍然不明白为什么你认为种子的随机性决定了偏见。它以其他方式影响安全性,但 prng 序列即使完全可预测,也可以是公正的。
  • 我的意思是在程序的两次不同执行中,而不是在同一个执行中。当然同一个序列本身不会有偏差,否则无论种子如何,它都不会是统一的。
  • 抱歉,我仍然不清楚您的意思...您是否有充分的理由相信,如果您运行代码数百万次,您会发现对某些字符的偏见?到目前为止,你所说的一切似乎都不能证明这一点。
猜你喜欢
  • 1970-01-01
  • 2018-12-31
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多