Java 安全随机散列

Java 安全随机散列,java,secure-random,Java,Secure Random,我试图看看我是否能得到一个基于安全随机散列的正确分发。我的第一个索引似乎总是加倍。我做错什么了吗 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

我试图看看我是否能得到一个基于安全随机散列的正确分发。我的第一个索引似乎总是加倍。我做错什么了吗

    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);

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

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

样本输出:

16735
16510
16657
16776
16599
16723

将%与RNG一起使用会使RNG输出产生偏差。只需使用
sr.nextInt(6)
@erickson,很高兴知道。“谢谢你的好奇。”埃里克森,谢谢你。你的建议也行。
long index = Math.abs(sr.nextLong()%6);
16735
16510
16657
16776
16599
16723