私が次のコードを持っているかどうか疑問に思っています:
int randomNum = Rand() % 18 + (-9);
これにより、-9から9までの乱数が作成されますか?
いいえ、ありません。あなたが探しています:
_int randomNum = Rand() % 19 + (-9);
_
-9から+9(両方を含む)まで19の異なる整数がありますが、Rand() % 18
は18の可能性しか与えません。これがRand() % 19
を使用する必要がある理由です。
コードは(0-9と17-9)=(-9と8)の間の数値を返します。
ご参考までに
Rand() % N;
0とN-1の間の数を返します:)
正しいコードは
Rand() % 19 + (-9);
新しい C++ 11疑似ランダム機能 を忘れないでください。コンパイラがすでにサポートしている場合は、オプションになる可能性があります。
疑似コード:
std::mt19937 gen(someSeed);
std::uniform_int_distribution<int> dis(-9, 9);
int myNumber = dis(gen)
-9から9までの18のカウント数があるのはあなたの言うとおりです。
しかし、コンピューターはゼロを含む整数(Zセット)を使用するため、19の数値になります。
Rand_MAXに対してRand()から取得する最小比率は0であるため、-9にするには9を減算する必要があります。
また、 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.));
疑問がある場合はいつでも、元のアルゴリズムで1億の乱数を取得するループを実行し、最小値と最大値を取得して、何が起こるかを確認できます。