C++では0または1のランダムな整数を生成しようとしています。現在、このコードを実行するたびに0が返されますが、その理由はわかりません。ここで問題は何ですか?
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = Rand() % 2;
cout << randomval << endl;
それは不運と呼ばれています。もう一回やってみよう。
私はこれが古い質問であることを知っていますが、これは質問に適切に答えると思います。
そのコードを実行するたびにジェネレータを再シードしないでください。
毎回同じ値にシードすることにより、同じ「ランダムな」数を取得するだけです。これは疑似乱数ジェネレータであるため、シード値に基づいて「乱数」が生成されることに注意してください。したがって、毎回同じ数をシードすると、毎回同じ数を取得するだけです。
解決策は、プログラムの実行中に一度だけsrand(time(NULL))を呼び出すことです。次に、Rand()を呼び出すたびに、毎回異なる数が得られます。
理論的には、50%の確率で0
、50-1
。これが機能するかどうかを確認するために、100などの別のモジュロを試してみてください。そして、確かにそうです。
このコードを数回実行しただけでは不十分です。
それをテストする他のアイデア:
srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
assert( 0 == ( Rand() % 2 ) );
}
bool random() {
if (Rand() % 2 == 0)
return true;
else return false;
}
srand(time(0));
を使用する場合、「乱数」は常に同じ秒で同じになることを付け加えておきます。プログラムを10000回実行してuniqでグループ化しようとすると、数が1秒以内に変化しないことがわかりました。
for i in `seq 1 10000`; do ./a.out; done | uniq -c
693 0
3415 1
675 0
673 1
665 0
674 1
668 0
711 1
694 0
673 1
459 0