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 サイトの他の関連記事を参照してください。