web-dev-qa-db-ja.com

ランダムなブール値

C++では0または1のランダムな整数を生成しようとしています。現在、このコードを実行するたびに0が返されますが、その理由はわかりません。ここで問題は何ですか?

#include <ctime>
#include <cstdlib>

srand(time(0));
int randomval = Rand() % 2;
cout << randomval << endl;
24
Rich Byden

それは不運と呼ばれています。もう一回やってみよう。

私はこれが古い質問であることを知っていますが、これは質問に適切に答えると思います。

そのコードを実行するたびにジェネレータを再シードしないでください。

毎回同じ値にシードすることにより、同じ「ランダムな」数を取得するだけです。これは疑似乱数ジェネレータであるため、シード値に基づいて「乱数」が生成されることに注意してください。したがって、毎回同じ数をシードすると、毎回同じ数を取得するだけです。

解決策は、プログラムの実行中に一度だけsrand(time(NULL))を呼び出すことです。次に、Rand()を呼び出すたびに、毎回異なる数が得られます。

24
cgossain

理論的には、50%の確率で0、50-1。これが機能するかどうかを確認するために、100などの別のモジュロを試してみてください。そして、確かにそうです。

このコードを数回実行しただけでは不十分です。

それをテストする他のアイデア:

srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
    assert( 0 == ( Rand() % 2 ) );
}
4
Kiril Kirov
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
1
toftis