【问题标题】:Simple deterministic method to generate an array of random numbers?生成随机数数组的简单确定性方法?
【发布时间】:2018-02-18 21:44:56
【问题描述】:

我正在寻找一种简单的方法来用数据填充大型 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];
}

什么是更好的方法?

【问题讨论】:

标签: java algorithm random


【解决方案1】:

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

例如:

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

【讨论】:

  • 你不能真正让 Random 变得安全,它只是一个 LCG。幸运的是,提问者对安全性不感兴趣。
【解决方案2】:

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

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

【讨论】:

  • 这是确定性的。 seed 没有按照你的想法做。不要尝试将 SecureRandom 用于确定性序列。
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多