隨機數在咱們平常是一個很是經常使用的東西,不管數據加密仍是搖骰子,目的都是要結果不可肯定,不管什麼結果都存在必定的機率。可是在咱們的計算機中隨機數究竟是怎麼產生的?java
大部分程序和編程語言確實產生的隨機數都是僞隨機數,好比像C語言,經常採用線性同餘或者經過一個種子產生的僞隨機數字,都是存在必定的規律可循。像咱們經常使用的高級編程語言java也是相似。例如java中獲取整數某個範圍內的數字源碼:編程
final int internalNextInt(int origin, int bound) { if (origin < bound) { int n = bound - origin; if (n > 0) { return nextInt(n) + origin; } else { // range not representable as int int r; do { r = nextInt(); } while (r < origin || r >= bound); return r; } } else { return nextInt(); } }
這也就證實了若是知道了這些種子,或者根據已經產生的隨機數字,就可以預測下一個可能產生的數字。微信
說到這裏,咱們反過來想想,真正的隨機數真的不存在嗎?像銀行就常常提示你們密碼不要用本身的生日,身份證號中某幾位數字或者本身的手機號,由於這樣隨時可能存在被破解的可能,咱們要儘可能使用一些隨機數字,好比說某個路口,在第一分鐘走了幾我的做爲你密碼的第一位,而後依次排列,這個數字就是隨機的。一樣咱們的計算機若是單純依賴於程序,可能就不存在真正的隨機數,若是把計算機軟件和外部硬件結合起來。好比說收集CPU天天轉速以及溫度,甚至某我的敲打鍵盤的頻率,磁盤寫入速度,等等信號。這樣也就產生了「純粹「的隨機數。 unix操做系統也就存在一個熵池,經過熵池來收集一些隨機值,這樣也就產生了真正意義上的隨機數字。編程語言
若有問題請微信掃碼回覆 加密