4

我在http://auto.howstuffworks.com/remote-entry2.htm看到一篇关于汽车远程进入系统的文章。在第三个项目符号中,作者说,

发射器和接收器都使用相同的伪随机数发生器。当发送器发送一个 40 位代码时,它会使用伪随机数生成器选择一个新代码,并将其存储在内存中。另一方面,当接收器接收到有效代码时,它会使用相同的伪随机数生成器来选择一个新代码。这样,发射器和接收器就同步了。接收器只有在收到它期望的代码时才会打开门。

是否可以让两个 PRNG 函数同时产生相同的随机数?

4

3 回答 3

11

在 PRNG 函数中,函数的输出取决于“种子”值,因此在给定相同种子值的情况下,连续调用将提供相同的输出。所以,是的。

一个示例(使用 C#)将类似于:

// Provide the same seed value for both generators:
System.Random r1 = new System.Random(1);
System.Random r2 = new System.Random(1);

// Will output 'True'
Console.WriteLine(r1.Next() == r2.Next());

这当然取决于随机数生成器使用某种确定性公式来生成其值。如果您使用所谓的“真正随机”数生成器,它在生成过程中使用熵或噪声的属性,那么在给定一些输入的情况下很难生成相同的值,除非您能够复制熵状态两个调用函数 - 当然,这会破坏使用这种生成器的目的......

在远程无钥匙进入系统的情况下,他们很可能使用确定性的 PRNG 功能来利用此功能。有许多 IC 提供这种功能来为电子电路生成随机数。

编辑:根据要求,这是一个不依赖于指定种子值的非确定性随机数生成器的示例:Quantum Random Number Generator。当然,正如 freespace 在评论中指出的那样,这不是一个伪随机数生成器,因为它生成的是真正的随机数。

于 2008-10-27T04:16:15.813 回答
3

大多数 PRNG 都有一个以种子形式存在的内部状态,它们用于生成下一个值。内部逻辑是这样的:

nextNumber = function(seed);
seed = nextNumber;

因此,每次生成新数字时,都会更新种子。如果您给两个使用相同算法的 PRNG 提供相同的种子,function(seed)则将评估为相同的数字(假设它们是确定性的,大多数都是)。

直接应用于您的问题:发射器选择一个代码,并将其用作种子。接收者在接收到它之后,使用它来播种它的生成器。现在两者对齐,它们将生成相同的值。

于 2008-10-27T04:27:48.537 回答
1

正如 Erik 和 Claudiu 所说,只要您使用相同的值播种 PRNG,您最终会得到相同的输出。

使用 AES(或任何其他加密算法)作为 PRNG 的基础时可以看到一个示例。只要您继续使用在两个设备(发射器和接收器)上匹配的输入,那么输出也将匹配。

于 2008-10-27T04:51:26.507 回答