2016-05-11 8 views
2

私は安全なランダムなハッシュに基づいて適切な配布を得ることができるかどうかを確認しようとしています。私はいつも私の最初のインデックスのために二倍になるようです。私はSecureRandom hash

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()という事実を無視している出力

Here is the output 
16548 
8362 
8314 
8175 
8272 
8210 
+1

RNGと%を使用して、バイアスにRNG出力を傾向があります。単に 'sr.nextInt(6)'を使用してください。 – erickson

+0

@erickson、お勧めします。 [詳細情報](http://stackoverflow.com/questions/10984974/why-do-people-say-there-is-modulo-bias-when-using-a-random-number-generator)好奇心のために。 – shmosel

+0

@erickson、ありがとうございます。あなたの提案も機能します。 – Paul

答えて

2

の最初の行を見てみましょうやっていることに何か問題があります。したがって、コードは-7 % 6 == -1なので、すべてのゼロ以外のインデックスの半分しか捕捉していませんが、-6 % 6 == 0のため、すべてのゼロインデックスをキャッチしています。

あなたはすべての値が0と5の間に上陸したい場合は、単にMath.abs()を使用します。

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

出力例:

16735 
16510 
16657 
16776 
16599 
16723