使用rand函数时发现,产生的随机数有相同的规律。查了一下才发现有真假随机数之分,好奇是什么导致了rand函数生成的是假随机数,而srand的是真随机数?
題主貌似搞錯了 srand 的功能了,這個函數用來設定隨機數的種子,並不是用來產生隨機數的。在種子確定的情況下,不斷呼叫 rand 產生的值序列就是確定,這就是偽隨機。
srand
rand
所謂真隨機,完全不可預測的隨機數,一般都是要讀取一些外部設備的白噪聲來獲得隨機數,比如耳機輸入口的噪聲,或者網卡接口的噪聲等。 *nix 系統裡面有個 /dev/random 就是用來產生這種真隨機數的。
/dev/random
真隨機是無法透過某個固定演算法來模擬的,因為一旦有了固定演算法,隨機序列就可以被預測,它就不算真隨機了。
剛剛去看了 php 的源碼,卻發現你的 tag 是 C++。不過也不影響,大同小異。
rand 函數是隨機數發生函數,這個函數是有規律的(你也發現了)。
srand 是播種函數,為隨機數產生器產生種子,然後 rand 函數根據這個初始化種子產生隨機數。
至於演算法,大部分隨機數產生器都使用線性同餘演算法。
下面是C++程式碼:
int __cdecl rand ( void ) { _ptiddata ptd = _getptd(); return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) & 0x7fff ); }
輸出是取除最高位的高 15 位的結果(32 位整數先右移 16 位,再取低 15 位)。
15
32
16
參考: http://www.cplusplus.com/reference/random/
srand只是用來設定隨機種子
http://zh.wikipedia.org/wiki/%E7%A1%AC%E4%BB%B6%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94% 9F%E6%88%90%E5%99%A8
題主貌似搞錯了
srand
的功能了,這個函數用來設定隨機數的種子,並不是用來產生隨機數的。在種子確定的情況下,不斷呼叫rand
產生的值序列就是確定,這就是偽隨機。所謂真隨機,完全不可預測的隨機數,一般都是要讀取一些外部設備的白噪聲來獲得隨機數,比如耳機輸入口的噪聲,或者網卡接口的噪聲等。 *nix 系統裡面有個
/dev/random
就是用來產生這種真隨機數的。真隨機是無法透過某個固定演算法來模擬的,因為一旦有了固定演算法,隨機序列就可以被預測,它就不算真隨機了。
剛剛去看了 php 的源碼,卻發現你的 tag 是 C++。不過也不影響,大同小異。
rand
函數是隨機數發生函數,這個函數是有規律的(你也發現了)。srand
是播種函數,為隨機數產生器產生種子,然後rand
函數根據這個初始化種子產生隨機數。至於演算法,大部分隨機數產生器都使用線性同餘演算法。
下面是C++程式碼:
輸出是取除最高位的高
15
位的結果(32
位整數先右移16
位,再取低15
位)。參考: http://www.cplusplus.com/reference/random/
srand只是用來設定隨機種子
http://zh.wikipedia.org/wiki/%E7%A1%AC%E4%BB%B6%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94% 9F%E6%88%90%E5%99%A8