【问题标题】:Why are the outputs of this pseudo random number generator (LFSR) so predictable?为什么这个伪随机数生成器 (LFSR) 的输出如此可预测?
【发布时间】:2013-02-10 17:02:08
【问题描述】:

最近我在这里问,如何在硬件中生成随机数,并被告知使用 LFSR。这将是随机的,但会在某个值后开始重复。

问题在于生成的随机数是如此可预测,以至于下一个值很容易被猜到。例如检查下面的模拟:

下一个“随机”数字可以通过将前一个数字与自身 +1 相加来猜测。有人可以验证这是否正常且可以预期。

这是我用于 LFSR 的代码:

    module LFSR(
    input clock,
    input reset,
     output [12:0] rnd 
    );

wire feedback = rnd[12] ^ rnd[3] ^ rnd[2] ^ rnd[0]; 

reg [12:0] random;

always @ (posedge clock or posedge reset)
begin
    if (reset)
        random <= 13'hF; //An LFSR cannot have an all 0 state, thus reset to FF
    else
        random <= {random[11:0], feedback}; //shift left the xor'd every posedge clock
end

assign rnd = random;

endmodule

异或位的位置从这里获取:The table page 5

【问题讨论】:

  • 等到'1'到达MSB,然后看看后面的数字是否仍然“可预测”...
  • 我很抱歉。我急忙和愤怒地回应。这对我来说显然是不合适的。

标签: hardware verilog fpga hdl


【解决方案1】:

LFSR 每个时钟只生成 一个 随机位。它不会在每个周期生成一个新的(在您的情况下)13 位数字。 rnd 中的其他 12 位只是旧的随机值,因此不会显得很随机。

如果您需要一个 13 位的随机数,那么您必须每 13 个周期对 LFSR 进行一次采样,或者将 13 个 LFSR 与不同的种子并行放置,并使用 13 个零位作为您的随机数。

【讨论】:

  • 谢谢。正如您所建议的,我设法通过每 13 个周期对电阻器进行采样来使其工作。而且它现在是随机的,那么通过这种方法现在是真正的随机吗?那不再是伪的?我避免了你的并行实现,因为重复所有代码来说 100 位 LFSR 是不切实际的。
  • 不,它仍然是伪随机的,因为可以通过知道用于生成它的算法和系统的当前状态来预测下一个数字。但是对于大多数用途(与安全无关),一个好的伪随机可能和真正的随机一样好。
  • 您不必等待 13 个时钟周期即可获得 13 位。您可以展开循环并添加更多 XOR 来预测 13 个周期内的值。当然,这是一大堆逻辑,所以它可能不适合你。
【解决方案2】:

LFSR 绝对不是任何真正意义上的“随机”。引用冯诺依曼的话:“任何考虑产生随机数字的算术方法的人,当然都处于一种罪恶状态。”我没有查看您选择的反馈项是否最大,这意味着它们将提供一个长度等于您的 LFSR 中的位数的序列,但这是您能做的最好的。

所以是的,LFSR 中的下一个值是非常可预测的。如果您需要更安全“随机”的东西,则需要研究加密方法,这些方法当然取决于密钥,并且计算量也比 LFSR 高得多。不过,你“得到你所支付的”。

顺便说一句,您可以得到可预测的“随机”数字的系统本身就非常有用。通常用于模拟目的。

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 2013-09-15
    • 2011-05-21
    • 2018-06-15
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多