gpt4 book ai didi

Java SecureRandom 内部状态

转载 作者:行者123 更新时间:2023-11-29 06:05:25 24 4
gpt4 key购买 nike

我正在尝试按照以下方式打乱整数数组,

来自http://en.wikipedia.org/wiki/Fisher-Yates_shuffle ,

“当 Fisher–Yates shuffle 与伪随机数生成器或 PRNG 一起使用时会出现另一个问题:由于此类生成器输出的数字序列完全由序列开始时的内部状态决定,因此 shuffle由这种生成器驱动的生成器不可能产生比生成器具有不同可能状态更多的不同排列。 ... "

  1. 如果我用大量字节作为 SecureRandom 生成器的种子就足够了吗?
  2. 填充种子字节数组的最简单方法是什么?即

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

最佳答案

这是一篇好文章:“A Java Programmer’s Guide to Random Numbers

基本上,a) 您不想使用 java.util.Random,因为它表现出周期性行为(随机性差),b) SecureRandom 是一个很大的对 java.util.Random 的改进,但根据您要随机播放的元素数量,它提供的自由度可能太小(有关详细信息,请参见 this section)。另一个问题是 SecureRandom 非常慢。如果您遇到性能问题,可以点击上面的链接获取比 SecureRandom 更快的替代 PRNG。

关于Java SecureRandom 内部状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8700278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com