ホームページ  >  記事  >  バックエンド開発  >  Apple システムでは「rand() % 14」が 6 または 13 しか返さないのはなぜですか?

Apple システムでは「rand() % 14」が 6 または 13 しか返さないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-24 20:59:21808ブラウズ

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 乱数ジェネレーター

Wikipedia によると、Apple の Marsaglia-Crépeau 乱数発生器 (RNG) で使用される乗数は次のとおりです。 16807。残念ながら、この乗数は 7 で割り切れます。その結果、srand() の後に生成される初期乱数は 14 を法とするエントロピー 1 ビットのみを持ち、可能な値は 6 または 13 の 2 つに制限されます。

簡単な解決策

この問題を回避するには、いくつかを破棄できます。 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 の欠陥のある乗算器によってもたらされるバイアスを効果的に排除できます。

以上がApple システムでは「rand() % 14」が 6 または 13 しか返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。