我刚刚阅读了AVR随机数生成器问题,并遇到了多种在AVR中生成随机种子的方法:
- 使用专用的“安全AVR”
- 使用内部温度传感器
- 读取未写入的EEPROM
- 测量用户输入之间的时间间隔
- 使用浮动ADC引脚。
为什么不只将一个数字引脚配置为输入而没有上拉和浮空呢?从理论上讲,应该生成随机位流。为什么不使用这个?状态变化太慢了吗?它倾向于卡在1还是0?还有其他问题吗?
我刚刚阅读了AVR随机数生成器问题,并遇到了多种在AVR中生成随机种子的方法:
为什么不只将一个数字引脚配置为输入而没有上拉和浮空呢?从理论上讲,应该生成随机位流。为什么不使用这个?状态变化太慢了吗?它倾向于卡在1还是0?还有其他问题吗?
Answers:
使用数字输入和模拟输入之间的不言而喻的区别是,模拟中可能存在更大的种子值跨度。
其次,但也许更关键:如果数字引脚的浮动“中值”不在逻辑检测电平(不是电源电平和接地轨电平,而是输入电路的开关阈值)之间的中间值,则结果位流将具有偏向1或0的强烈偏见。这种偏见比类似水平的偏斜要严重得多。
将“浮动”数字引脚推到浮动状态,只需通过很少的耦合,无论是来自附近的迹线或信号,还是通过某种电阻性上拉/下拉(无论是设计的还是偶然的),即可将其“浮动”起来—部署。在工程设计中,最好避免这种形式的故障模式。
浮动输入未定义。它可以为您提供随机的位,但也可能会卡在0或1上。在大多数情况下,它会卡住。当它真正浮动时,可能会导致系统噪声和功耗增加。浮动输入通常是一件坏事,即使输入没有被使用。
最简单的解决方案是从滥用的集电极开路晶体管电路中构建硬件随机信号发生器电路。使用位流输出到微控制器上的输入。间隔采样输入的位。要确保1和0的数目大致为偶数,只需将状态更改作为1而不将状态更改作为0。Google提供了有关晶体管噪声发生器的更多信息。
许多微控制器中都有一个随机发生器,它是两个时钟源(也许是一个内部时钟源,另一个是外部时钟源)之间的误差。当您比较它们时,它们会由于噪声而稍微漂移,因此可以使用。
最后,这取决于您需要什么?稍微随机化,您甚至可以使用一个未连接的ADC引脚。或者只是使用类似的算法
梅森捻线器http://en.wikipedia.org/wiki/梅森_twister
如果这在密码上是安全的,则没有任何限制,但是对于大多数目的来说已经足够了。
随机种子及其算法的质量取决于每个随机位中的熵或不确定性的数量。然后,种子的最佳生成器使用极少步骤的高熵,而不是许多低熵的步骤。
高熵的一个很好的例子是对随机种子使用Latin Squares方法。
浮动输入很容易受到缺陷,泄漏或进入噪声的影响。
在PIC18F微处理器中,您需要为随机数提供种子。种子可以是0到32767(15位)之间的任何值。我建议在程序开始时,使引脚和模拟输入引脚之一。读取该引脚并取最低有效位并将其放入16位变量中。然后将变量向左移动1。再次读取该引脚,并将ADC结果的LSB放入存储了最后一位的变量的第一位。再次向左移动.....
重复此过程,直到变量中有15位。这是您需要放入种子中的数字。
完成此操作后,您可以简单地将模拟输入引脚设为数字输入引脚并对其进行弱上拉,或者将其设为数字输出引脚。任一个都会阻止该引脚浮空。