假设我有一些数字形成一个系列 例如:652,328,1,254 我希望得到一个种子,如果我,例如,
srand(my_seed);
我会得到某种与我的原始序列有界误差的近似, 当所有数字以相同的顺序出现时。
答案 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。所以这取决于你的算法。