C++で0または1のランダムなintを生成しようとしています。現在、このコードを実行するたびに0を受け取りますが、その理由はわかりません。ここでの問題は何ですか?
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2;
cout << randomval << endl;
それは不運と呼ばれています。もう一度やってみる。
私はこれが古い質問であることを知っていますが、これは質問に正しく答えると信じています。
そのコードを実行するたびにジェネレーターを再シードしないでください。
毎回同じ値にシードすることで、同じ「乱数」を取得できます。これは疑似乱数ジェネレータであることに注意してください。シード値に基づいて、「乱数」が生成されます。したがって、毎回同じ番号をシードすると、毎回同じ番号を取得することになります。
解決策は、プログラムの実行中にsrand(time(NULL))を1回だけ呼び出すことです。次に、rand()を呼び出すたびに、毎回異なる番号が与えられます。
理論的には、50%の確率0
で、50-が得られます1
。これが機能するかどうかを確認するために、別のモジュロ(たとえば、100)を試してみることをお勧めします。そして、私はそれがすることを確信しています。
このコードを数回実行しただけですが、十分ではありません。
それをテストする他のアイデア:
srand(time(0));
for( int i = 0; i < 1000000; ++i )
{
assert( 0 == ( rand() % 2 ) );
}
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
bool random() {
if (rand() % 2 == 0)
return true;
else return false;
}
一度だけ電話srand(time(NULL));
してください。
次に、このようなループを使用します。この方法では、常に0または1が得られます。
#include <stdio.h>
#include <stdlib.h>
srand(time(NULL));
for (i=0;i<10;i++)
{
printf("%d\n",rand() % 2);
i++;
}
return 0;
あなたのコードはあなたがそれらを同じように受け取りたいことを示唆していますが、あなたはそれを述べていませんでした、そしておそらくあなたは他の方法でそれをすることは不可能だと単に思ったでしょう。別のディストリビューションが必要で、コードを書き直したい(そしてC ++ 11に準拠させたい)場合は、次のようにすることができます。
const double chance = 0.3; // this is the chance of getting true, between 0 and 1;
std::random_device rd;
std::mt19937 mt(rd());
std::bernoulli_distribution dist(chance);
bool result = dist(mt);
ループでそれを行う必要がある場合は、最後のステートメントのみを繰り返し、dist(mt)
生成されたすべてのオブジェクトを再作成せずにそのままにします。
あなたは何に対してもチェックしていません。使用する:
#include <ctime>
#include <cstdlib>
srand(time(0));
int randomval = rand() % 2 == 0;
cout << randomval << endl;