rand() % 14 之謎僅產生6 或13
程式設計師遇到了一個特殊問題,其中rand() % 14始終一致在他們的C 程式中只回傳6 或13。儘管多次運行該程序,這些值都是唯一的結果。
有問題的代碼:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main(int argc, const char * argv[]) { srand(time(NULL)); cout << rand() % 14; return 0; }
罪魁禍首:Apple 的MCG 隨機數產生器
根據維基百科,Apple 的Marsaglia- Crépeau 隨機數產生器所使用的乘數(RNG) 是16807。不幸的是,這個乘數可以被 7 整除。因此,srand() 之後產生的初始隨機數僅具有一位模 14 的熵,將其限制為兩個可能的值:6 或 13。
一個簡單的解
要避免這個問題,可以放棄srand() 之後立即產生一些隨機數。透過這樣做,後續隨機數的熵會增加,從而允許更廣泛的值。
這是修改後的代碼:
int main(int argc, const char * argv[]) { srand(time(NULL)); // Discard the first few random numbers to eliminate the bias for (int i = 0; i < 10; ++i) rand(); cout << rand() % 14; return 0; }
丟棄前 10 個隨機數,您有效地消除了 MCG RNG 有缺陷的乘數所帶來的偏差。
以上是為什麼 `rand() % 14` 在 Apple 系統上只回傳 6 或 13?的詳細內容。更多資訊請關注PHP中文網其他相關文章!