-1

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

    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.
    }        

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

4

2 回答 2

3

它当然意味着均匀分布(因此没有偏差)。从文档中

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

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

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

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

于 2012-10-22T06:30:21.283 回答
-1

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

于 2012-10-22T06:29:43.557 回答