0

コードは

return min + static_cast<int>(static_cast<double>(max - min + 1.0) *
  (number / (UINT_MAX + 1.0)));

number は、rand_s によって取得される乱数です。min と max は int で、最小値と最大値 (両端を含む) を表します。

unsigned int を数値として使用しない解決策を提供する場合は、ランダムにする方法も説明してください。

rand() を使用してソリューションを提出しないでください。

4

5 に答える 5

3

@アンドリュー・スタイン

In Numerical Recipes in C: The Art of Scientific Computing (William H. Press、Brian P. Flannery、Saul A. Teukolsky、William T. Vetterling; New York: Cambridge University Press、1992 (第 2 版、p. 277)) 、次のコメントが作成されます。

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

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

そして決して似たようなものではありません

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

(下位ビットを使用します)。」

からman 3 rand

于 2008-09-26T17:36:15.823 に答える
3

static_cast<double>とにかく「+1.0」によってプロモーションが2倍になるため、これは冗長です。

于 2008-09-26T17:39:20.527 に答える
1

Boost:Randomはどうですか

于 2008-09-26T17:29:01.207 に答える
0

double の代わりに unsigned long long で演算を行うことができますが、ULONGLONG_MAX >= UINT_MAX*UINT_MAX の場合のみで、これはおそらく実装定義です。しかし、それについて心配している場合は、(max - min) または RAND_MAX が大きい場合に、元のコードの精度が失われる可能性について心配することになります。

long long が実際に速いかどうかは、プラットフォームのハードウェア フロートがどれだけ優れているかに依存する場合があります。しかし、整数演算は浮動小数点演算よりも本質的に単純です。

于 2008-09-26T19:11:20.040 に答える
-1

何かのようなもの

min + number % (max - min + 1)

エンドケースを確認する

于 2008-09-26T17:32:02.963 に答える