できるよ
cout << rawRand % 100 << endl; // Outputs between 0 and 99
cout << rawRand % 101 << endl; // outputs between 0 and 100
反対票を投じる人々のために。これが最初に投稿されてから1分後にコメントを残したことに注意してください。
http://www.cplusplus.com/reference/clibrary/cstdlib/randから"ただし、このモジュロ操作では、スパン内に真に均一に分散された乱数が生成されないことに注意してください (ほとんどの場合、数値が小さいほどわずかに可能性が高いため)、しかし、これは一般に、短いスパンの適切な近似値です。」
64 ビットの int で 100 個の数値を出力として使用すると、数値 0 ~ 16 は数値の 1.00000000000000000455 % で表されます (約 10 -18による 1% の同一分布に対する相対精度)、数値 17 ~ 99 は表されます数字の 0.99999999999999999913 % で。はい、完全に分散しているわけではありませんが、小さなスパンでは非常に適切な近似です。
また、OP はどこで同一分布の数値を要求するのでしょうか? 私たちが知っている限りでは、これらは小さな逸脱が問題にならない目的で使用されています (たとえば、暗号化以外のもの - そして彼らが暗号化のために数値を使用している場合、この質問は彼らが独自の暗号化を作成するにはあまりにも単純すぎます) )。
編集- 乱数の均一な分布に本当に関心がある人には、次のコードが機能します。これは、64 ビットのランダムな int の場合と同様に必ずしも最適であるとは限らないことに注意してくださいrand()。
unsigned N = 100; // want numbers 0-99
unsigned long randTruncation = (RAND_MAX / N) * N;
// include every number the N times by ensuring rawRand is between 0 and randTruncation - 1 or regenerate.
unsigned long rawRand = rand();
while (rawRand >= randTruncation) {
rawRand = rand();
// with 64-bit int and range of 0-99 will need to generate two random numbers
// about 1 in every (2^63)/16 ~ 10^18 times (1 million million times)
// with 32-bit int and range of 0-99 will need to generate two random numbers
// once every 46 million times.
}
cout << rawRand % N << stdl::endl;