これが、デッキシャッフルルーチンで使用したいFisher-YatesのC実装です。私はこれを正しく行っていますか(n =配列の長さ)?
注:do-whileループは、モジュロバイアスを修正しようとします(ここを参照)。これは手順に少しオーバーヘッドを追加し、低ビットバイアスを気にしない場合は排除できます。
void shuffle(int *array, int n) {
int i, j, tmp, upper_bound;
srand(time(NULL));
for (i = n - 1; i > 0; i--) {
upper_bound = RAND_MAX - ((RAND_MAX % (i + 1)) + 1);
do {
j = rand() % (i + 1);
} while (j > upper_bound);
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}