2

我正在尝试查看是否可以基于安全随机散列获得正确的分布。我的第一个索引似乎总是加倍。我做错了什么吗

    SecureRandom sr = new SecureRandom();

    sr.setSeed(sr.generateSeed(16));
    int zero = 0;
    int one = 0;
    int two = 0;
    int three = 0;
    int four = 0;
    int five = 0;
    int six =0;


    for (int i = 0 ; i < 100000; i++) {
        long index = sr.nextLong()%6;
        if(index == 0)
            zero++;
        else if (index == 1)
            one++;
        else if(index == 2)
            two++;
        else if(index == 3)
            three++;
        else if(index == 4)
            four++;
        else if(index == 5)
            five++;
    }
    System.out.println(zero);
    System.out.println(one);
    System.out.println(two);
    System.out.println(three);
    System.out.println(four);
    System.out.println(five);
    System.out.println(six);

看看输出的第一行

Here is the output
16548
8362
8314
8175
8272
8210
4

1 回答 1

2

您忽略了SecureRandom.nextLong()可以返回负数的事实。因此,您的代码仅捕获了所有非零索引的一半,因为-7 % 6 == -1,但它捕获了所有零索引,因为-6 % 6 == 0.

如果您希望所有值都在 0 和 5 之间,只需使用Math.abs()

long index = Math.abs(sr.nextLong()%6);

样本输出:

16735
16510
16657
16776
16599
16723
于 2016-05-11T23:16:03.253 回答