web-dev-qa-db-ja.com

C ++では-9から9までの乱数

私が次のコードを持っているかどうか疑問に思っています:

int randomNum = Rand() % 18 + (-9);

これにより、-9から9までの乱数が作成されますか?

14
Danny

いいえ、ありません。あなたが探しています:

_int randomNum = Rand() % 19 + (-9);
_

-9から+9(両方を含む)まで19の異なる整数がありますが、Rand() % 18は18の可能性しか与えません。これがRand() % 19を使用する必要がある理由です。

29
NPE

コードは(0-9と17-9)=(-9と8)の間の数値を返します。

ご参考までに

 Rand() % N;

0とN-1の間の数を返します:)

正しいコードは

Rand() % 19 + (-9);
7
Davide Aversa

新しい C++ 11疑似ランダム機能 を忘れないでください。コンパイラがすでにサポートしている場合は、オプションになる可能性があります。

疑似コード:

std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)
6
KillianDS

-9から9までの18のカウント数があるのはあなたの言うとおりです。

しかし、コンピューターはゼロを含む整数(Zセット)を使用するため、19の数値になります。

Rand_MAXに対してRand()から取得する最小比率は0であるため、-9にするには9を減算する必要があります。

以下の情報は非推奨です。マンページにはありません。このタスクには modernC++ の使用もお勧めします。

また、 Rand関数のマンページ 引用符:

「1〜10のランダムな整数を生成する場合は、次のように常に上位ビットを使用して生成する必要があります。

j = 1 + (int) (10.0 * (Rand() / (Rand_MAX + 1.0)));

似たようなことは決してない

j = 1 + (Rand() % 10);

(下位ビットを使用)。 "

したがって、あなたの場合これは次のようになります:

int n= -9+ int((2* 9+ 1)* 1.* Rand()/ (Rand_MAX+ 1.));
3
nurettin

疑問がある場合はいつでも、元のアルゴリズムで1億の乱数を取得するループを実行し、最小値と最大値を取得して、何が起こるかを確認できます。

0
Petruza