生成随机数数组的简单确定性方法?

时间:2018-02-18 21:44:56

标签: java algorithm random

我正在寻找一种用数据填充大int[] testArray的简单方法。方法应该接受一个参数来生成一个确定的整数序列,但乍看之下看起来像噪声。

想到这样的事情,但数据可能有模式。

public int[] populate(int arraySize, int somePrime){
int[] testArray = new int[arraySize];
int offset = -100000; 
long fib = 0; long fibm1 = 1; long fibm2 = 1; 
//...
for(int i = offset; i< testArray.length; i++){
    fib= fibm1+ fibm2;
    fibm2= fibm1;
    fibm1= fib;
    if(i >= 0){  testArray[i] = (int) fib%somePrime; }
    }

return testArray[i];
}

什么是更好的方法?

2 个答案:

答案 0 :(得分:5)

您可以通过使用固定种子初始化随机数生成器来完成此操作。它生成的序列对于不知道种子的人来说是随机的,但是你可以通过再次使用相同的种子来重建序列。

例如:

Random r = new Random(mySeed);
int[] testArray = new int[arraySize];
for(int i=0; i<arraySize; i++) {
    testArray[i] = r.nextInt();
}

更新:此方法很容易通过反复试验来猜测您的种子,特别是如果它是一个小数字或其他可预测的。您还可以存储一个秘密的固定种子,并将两者合并为一个更长的种子。但是你应该小心你如何做到这一点,因为存在陷阱。请参阅Deterministically combine more than one source of entropy

答案 1 :(得分:1)

您可以使用SecureRandom。然后你可以使用你的号码来生成种子:

int seed = 1234;
Random rand = new SecureRandom(SecureRandom.getSeed(seed));
int number = rand.nextInt();