3

このコードは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;

コードの何が問題になっていますか?

4

6 に答える 6

9

lowestとの間のランダムな整数が必要な場合は、次のhighestように記述します。

random_integer = lowest + rand() % range
于 2012-09-25T10:18:16.510 に答える
6

ここでオーバーフローする可能性があります- range*rand()

通常の人々が使用するものを使用するだけです:rand() % 10 + 1

于 2012-09-25T10:18:24.363 に答える
5
range * rand() / (RAND_MAX + 1.0)

あなたが思うことをしません。いくつかの親を紹介します:

range * (rand() / (RAND_MAX + 1.0))

(ただし、この方法では偏った分布が得られることに注意してください。)

于 2012-09-25T10:19:22.290 に答える
2

上記のすべての解決策に同意します。
これで、プログラムを実行するたびに異なるシーケンスを取得するために、srand()関数を使用できます。これにより、次のようにrand()関数にシードが提供 されます。

srand(time(NULL))  
random_integer = lowest + rand() % range 
于 2012-09-25T11:18:19.477 に答える
0

rand()あなたはそれが0と1の間の値を返すと仮定しているようです。

これは正しくありません。0から。までの値を返しますRAND_MAX

于 2012-09-25T10:26:05.487 に答える
0

この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;
}
于 2012-09-25T13:25:54.393 に答える