特定の乱数を除いて、どうすれば一意の乱数を生成できるのか疑問に思っていました。たとえば、 range1 to 10 except from 3
で数値を生成したい場合、出力は次のようになります。
7 6 1 2 4 9 5 8 10
1 から 10 までの数字をシャッフルし、3 を取り除きます。
シャッフルの前後に 3 を削除しても問題ありません。
または、1 ~ 9 の数字をシャッフルして、3 を 10 に変更します。
バイアスのないシャッフルには、たとえば Fisher-Yates アルゴリズムを使用できます。http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
1 ~ 9 の範囲で乱数を生成し、その数が 3 以上の場合は 1 を追加します。
これが私の答えです - 「除く」を除いて、[最小、最大)でランダムな値を返します。
int myrand(int min, int max, int except) {
int rc;
do {
rc = min + rand() % (max - min);
} while(rc == except);
return rc;
}