以下のように整数の配列をシャッフルしようとしています、
およびhttp://en.wikipedia.org/wiki/Fisher-Yates_shuffleから、
「フィッシャー-イェーツシャッフルを疑似乱数ジェネレーターまたはPRNGで使用すると、追加の問題が発生します。このようなジェネレーターによって出力される数値のシーケンスは、シーケンスの開始時の内部状態によって完全に決定されるため、シャッフルはそのようなものによって駆動されます。ジェネレーターは、ジェネレーターが明確な可能な状態を持っているよりも明確な順列を生成できない可能性があります。... "
- SecureRandomジェネレーターに大量のバイトをシードするだけで十分ですか?
シードバイト配列を埋める最も簡単な方法は何ですか?すなわち
byte [] seed = new byte [2048]; //シードバイトをランダムなもので埋めます。最も簡単な方法は何ですか?SecureRandom secureRandom = new SecureRandom(seed);
コード:
/**
* http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
*
* To shuffle an array a of n elements (indices 0..n-1):
* for i from n − 1 downto 1 do
* j ← random integer with 0 ≤ j ≤ i
* exchange a[j] and a[i]
*/
public int[] shuffle (int[] inSet ) {
int [] returnSet = Arrays.copyOf(inSet, inSet.length);
for( int i = inSet.length-1; i > 0; i-- ) {
// j ← random integer with 0 ≤ j ≤ i
int j = secureRandom.nextInt(i+1);
// swap returnSet[i] and returnSet[j]
int temp = returnSet[i];
returnSet[i] = returnSet[j];
returnSet[j] = temp;
}
return returnSet;
}