是否有可能基于有限的伪随机数序列得到种子的近似值?

时间:2010-01-27 08:59:34

标签: algorithm random srand

假设我有一些数字形成一个系列 例如:652,328,1,254 我希望得到一个种子,如果我,例如,

srand(my_seed);

我会得到某种与我的原始序列有界误差的近似, 当所有数字以相同的顺序出现时。

4 个答案:

答案 0 :(得分:3)

取决于用于伪随机生成的算法。如果算法是一个简单的linear congruential generator,那么获取种子只是解决线性模块方程的问题(注意解决方案可能是非唯一的,但是因为这样的发生器是无记忆的,它不会没问题。

如果算法更复杂,这可能是不可能的。

请注意,C标准库中使用的算法不受标准限制,因此不同的平台可能有不同的实现。

答案 1 :(得分:1)

查看此question

就像Justin所说的那样,当你有一系列生成的数字时,可以回溯一个线性全等生成器(rand()实现经常是)。我想问题是要知道以前哪个值是原始种子...

答案 2 :(得分:1)

一般情况下,您不能有错误限制。您的算法可以运行,也可以不运行。这样做的原因是合理的误差限制明显小于RAND_MAX。这反过来意味着低位不像高位那样随机。但是一个好的PRNG确保所有比特都是随机的。

考虑RNG算法的这个缓慢但数学上合理的例子:

int rand() {
  state = AES_encrypt(state);
  return state % RAND_MAX;
}
void srand(int seed) {
  state = AES_encrypt(seed);
}

如果您可以在输出序列与之前的state之间找到任何重要的相关性,则应认为AES算法已损坏。

答案 3 :(得分:1)

密码学PRNG的定义是这种精确性质在计算上不可行的定义 - 然而,正如已经提到的,有可能存在更弱(和更快)的PRNG。所以这取决于你的算法。