以下随机数生成没有偏差吗?

时间:2012-10-22 06:24:49

标签: java security random

以下代码是否会生成带或不带偏差的随机数?

    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的chars中选择String,因此范围为0-29。省略了选择char值的代码,因为它与问题无关。

2 个答案:

答案 0 :(得分:3)

肯定意味着是一个统一的分布(因此没有偏见)。来自the documentation

  

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

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

  

加密强随机数最低限度符合FIPS 140-2“加密模块的安全要求”第4.9.1节中规定的统计随机数生成器测试。

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

答案 1 :(得分:-1)

结果 应该<{3}}定义,但在您的示例中,您不使用种子来初始化PNRG,因此可能存在偏差

相关问题