我剛剛閱讀了問題 AVR隨機數生成器 ,並遇到了多種在AVR中生成隨機種子的方法:
- 使用專用的“安全AVR”
- 使用內部溫度傳感器
- 讀取未寫入的EEPROM
- 測量用戶輸入之間的時間間隔
- 使用浮動ADC引腳。
為什麼不將單個數字引腳配置為輸入而沒有上拉和浮空?從理論上講,應該生成隨機位流。為什麼不使用這個?狀態變化太慢了嗎?它傾向於卡在1還是0?還有其他問題嗎?
我剛剛閱讀了問題 AVR隨機數生成器 ,並遇到了多種在AVR中生成隨機種子的方法:
為什麼不將單個數字引腳配置為輸入而沒有上拉和浮空?從理論上講,應該生成隨機位流。為什麼不使用這個?狀態變化太慢了嗎?它傾向於卡在1還是0?還有其他問題嗎?
使用數字輸入和模擬輸入之間的不言而喻的區別是,模擬中可能會有更大的種子值跨度。
第二,但也許更關鍵:如果數字引腳是浮動的“中值”值並非恰好介於邏輯檢測電平(不是電源電平和接地軌電平,而是輸入電路的開關閾值)之間的中間值,因此所得的位流將對1或0產生強烈的偏倚。
與附近的走線或信號,或者通過一些電阻性上拉/下拉(無論是設計的還是偶然的),耦合所需的信號耦合很少。將“浮動”數字引腳推到浮動位置-部署後也可能會發生這種情況。在工程設計中,最好避免這種形式的故障模式。
未定義浮動輸入。它可以為您提供隨機的位,但也可能會卡在0或1上。在大多數情況下,它會卡住。當它真正浮動時,可能會導致系統噪聲和功耗增加。浮動輸入通常是一件壞事,即使輸入沒有被使用。
最簡單的解決方案是從濫用的集電極開路晶體管電路中構建硬件隨機信號發生器電路。使用位流輸出到微控制器的輸入。間隔採樣輸入的位。要確保1和0的數目大致為偶數,只需將狀態變化作為1而不將狀態變化作為0。 Google提供了晶體管噪聲發生器,以獲取更多信息。
“隨機”是一個棘手的詞。在某些情況下,它僅表示“不可預測”,但在其他情況下(尤其是與信號處理和加密相關聯的情況),則表示“統計上不相關”。
即使從浮動讀取的值引腳是不可預測的(從第一個意義上講是“隨機”),從第二個意義上說,它不太可能有用。
在許多微控制器中可用的一個隨機發生器是兩個時鐘源(也許是一個內部時鐘源,另一個是外部時鐘源)之間的誤差。當您比較它們時,它們會由於噪聲而略有漂移,因此可以使用。
最後,這取決於您需要什麼?稍微隨機化,您甚至可以使用未連接的ADC引腳。或者,只要使用
Mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister
之類的算法,即使該算法在密碼學上是安全的,但足以滿足大多數用途。
隨機種子及其算法的質量由每個隨機位中的熵或不確定性量決定。然後,種子的最佳生成器使用極少步驟的高熵,而不是許多低熵的步驟。
高熵的一個很好的例子是對隨機種子使用 Latin Squares方法。
浮動輸入容易受到缺陷,洩漏或進入噪聲的影響。
在PIC18F微處理器中,您需要具有隨機數的種子。種子可以是0到32767(15位)之間的任何值。我建議在程序開始時,使引腳和模擬輸入引腳之一。讀取該引腳並取最低有效位並將其放入16位變量中。然後將變量向左移動1。再次讀取該引腳,並將ADC結果的LSB放入存儲了最後一位的變量的第一位。再次向左移動.....
重複此操作,直到變量中有15位為止。這是您需要放入種子中的數字。
完成此操作後,您可以簡單地將模擬輸入引腳設為數字輸入引腳並對其進行弱上拉,或者將其設為數字輸出引腳。任一個都會阻止該引腳浮空。