我正在尝试按照下面的方法洗净整数数组,
然后从http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
“当Fisher-Yates随机播放与伪随机数生成器或PRNG一起使用时,还会出现另一个问题:由于此类生成器输出的数字序列完全由序列开始时的内部状态决定,因此随机数驱动生成器可能无法产生比生成器具有不同可能状态更独特的排列。
如果我给我的SecureRandom生成器添加很多字节就足够了吗?
填充种子字节数组的最简单方法是什么?
即
字节[]种子=新字节[2048];
//用随机的东西填充种子字节,最简单的方法是什么?
SecureRandom secureRandom =新的SecureRandom(种子);
码:
/**
* 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;
}
最佳答案
这是一篇好文章:“ A Java Programmer’s Guide to Random Numbers”
基本上,a)您不想使用java.util.Random
,因为它表现出周期性的行为(不良的随机性),b)SecureRandom
是对java.util.Random
的重大改进,但取决于要改组的元素数量,它提供的自由度可能太小(有关详细信息,请参见this section)。另外一个问题是SecureRandom
相当慢。如果您遇到性能问题,可以通过上面的链接获取比SecureRandom
更快的替代PRNG。
关于java - Java SecureRandom内部状态,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8700278/