假设我有一些数字,形成串联 例如:652,328,1,254 我想获得的种子,如果我,例如,做

srand(my_seed);

我会得到某种近似的有界错误我origonal序列, 当出现在相同的顺序的所有数字。

有帮助吗?

解决方案

取决于用于伪随机生成的算法。如果算法是一个简单的线性同余发生器,然后让种子回来只是一个事求解线性方程的模块化(说明该溶液可以是不唯一的,但作为这样的发电机是无记忆,它并不重要)。

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

注意的是,在C标准库中使用的算法没有被标准的限制,所以不同的平台可能具有不同的实现。

其他提示

可以不具有在一般结合的错误。无论你的算法工作或没有。这样做的原因是,结合合理的错误是明显RAND_MAX小得多。这反过来又意味着该低比特不是随机作为较高位。但良好的PRNG,就可以确保所有的位都同样是随机的。

考虑的RNG算法的这种缓慢但在数学上的声音的示例:

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

如果可以找到输出序列和先前state之间的任何相关性显著,AES算法应考虑断裂。

检查出这个问题

像贾斯汀说,这是可能的回溯的线性同余发生器(其rand()实现经常是)时,你有生成的数字的序列。我想这个问题是知道哪些先前值中的一个是原始种子...

一个crytographic PRNG的定义是其中此确切属性是计算上不可行的 - 然而,如已经提到的,有弱得多(和更快)的PRNG针对这是可能的。所以,这取决于你的算法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top