このコードは1から10までの乱数を生成することになっていますが、毎回1を返します。
int random_integer;
int lowest=1, highest=10;
int range=(highest-lowest)+1;
random_integer = lowest + int(range*rand()/(RAND_MAX + 1.0));
cout << random_integer << endl;
コードの何が問題になっていますか?
lowest
との間のランダムな整数が必要な場合は、次のhighest
ように記述します。
random_integer = lowest + rand() % range
ここでオーバーフローする可能性があります- range*rand()
。
通常の人々が使用するものを使用するだけです:rand() % 10 + 1
。
range * rand() / (RAND_MAX + 1.0)
あなたが思うことをしません。いくつかの親を紹介します:
range * (rand() / (RAND_MAX + 1.0))
(ただし、この方法では偏った分布が得られることに注意してください。)
上記のすべての解決策に同意します。
これで、プログラムを実行するたびに異なるシーケンスを取得するために、srand()関数を使用できます。これにより、次のようにrand()関数にシードが提供 されます。
srand(time(NULL))
random_integer = lowest + rand() % range
rand()
あなたはそれが0と1の間の値を返すと仮定しているようです。
これは正しくありません。0から。までの値を返しますRAND_MAX
。
この2つは常に私のプログラムの一部です
float randf(float lo, float hi) {
float random = ((float) rand()) / (float) RAND_MAX;
float diff = hi - lo;
float r = random * diff;
return lo + r;
}
int randi(int lo, int hi)
{
int n = hi - lo + 1;
int i = rand() % n;
if (i < 0) i = -i;
return lo + i;
}