首頁 >後端開發 >C++ >為什麼 `rand() % 14` 在 Apple 系統上只回傳 6 或 13?

為什麼 `rand() % 14` 在 Apple 系統上只回傳 6 或 13?

Susan Sarandon
Susan Sarandon原創
2024-11-24 20:59:21891瀏覽

Why Does `rand() % 14` Only Return 6 or 13 on Apple Systems?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn