首頁 > 後端開發 > C++ > 主體

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

Susan Sarandon
發布: 2024-11-24 20:59:21
原創
806 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板