我試圖洗牌整數按照下面的陣列,爪哇SecureRandom的內部狀態
和從http://en.wikipedia.org/wiki/Fisher-Yates_shuffle,
當費 - 耶茨洗牌與僞隨機數使用的「出現的另一個問題發生器或PRNG:由於這種發生器輸出的數字序列完全由其序列開始時的內部狀態決定,因此由這樣的發生器驅動的混洗不可能產生比發生器具有明顯可能狀態更多不同的排列。 ..「
- 如果我的SecureRandom生成器擁有大量字節,這足夠了嗎?
填充種子字節數組最簡單的方法是什麼? 即
字節[]種子=新的字節[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;
}
您確定您需要/想要使用* SecureRandom *嗎? - 它實際上是用於加密操作。 順便說一句,我已經看到Android設備上的/ dev/random和/ dev/urandom,這對於PRNG的質量播種來說可能是一個不錯的選擇。用於密碼學。 – JimmyB 2012-01-02 13:05:55