モジュラス演算a % b
は、除算の剰余を計算しa / b
ます。明らかに除算の剰余はより小さくなければならずb
、a
がランダムな正の整数a%b
である場合、 は範囲 0 .. (b-1) のランダムな整数です。
あなたが言及したコメントで:
rand()%(最大-最小)+最小
このアルゴリズムは、ハーフオープン範囲 [min, max) の値を生成します。(つまり、max は範囲外であり、単に境界を示します。整数の範囲について話しているので、この範囲は閉じた範囲 [min, max-1] と同等です。)
「0 - 5」または「6 - 12」と書くと、それらは閉じた範囲です。上記の式を使用するには、同等の半開範囲を示す値を使用する必要があります: [0, 6) または [6, 13)。
rand() % (6-0) + 0
rand() % (13-6) + 6
rand() % (max-min) + min
これは、明らかにすでに学習したルールの単なる一般化であることに注意してください。これrand() % n
は、範囲 0 ~ (n-1) の値を生成します。同等の半開範囲は [0, n) とrand() % n
==rand() % (n-0) + 0
です。
したがって、レッスンは次のとおりです。半開きの範囲と閉じた範囲を混同しないでください。
2 つ目の教訓は、これは、独自の分布を手動で計算<random>
するよりも使いやすい別の方法を示しているということです。rand()
ビルトインをuniform_int_distribution
使用すると、目的の包括的な範囲を直接指定できます。0 から 5 の範囲が必要な場合はuniform_int_distibution<>(0, 5)
、6 から 12 の範囲が必要な場合はuniform_int_distribution<>(6, 12)
.
#include <random>
#include <iostream>
int main() {
std::default_random_engine eng;
std::uniform_int_distribution<> dist(6, 12);
for (int i=0; i<10; ++i)
std::cout << dist(eng) << " ";
}
rand()%7+6
はより簡潔ですが、使いやすいというわけではありません。