Пример реализации алгоритма C в приведенном вами ответе следующий:
#define M 10
#define N 100
int in, im;
im = 0;
for (in = 0; in < N && im < M; ++in) {
int rn = N - in;
int rm = M - im;
if (rand() % rn < rm)
/* Take it */
vektor[im++] = in + 1; /* +1 since your range begins from 1 */
}
Алгоритм Кнута. Это очень простой алгоритм со сложностью O (N) (то есть числового диапазона), , что означает, что он наиболее пригоден для использования, когда M близок к N.
но вы устанавливаете M == N
, что не близко, но равно
Итак, начальные значения rn
и rm
одинаковы. поэтому, который не может заставить алгоритм работать должным образом, потому что:
whatever % rn < rm
всегда верно, как 345436 % 22 < 22
, так как a % b < b
, всегда.
Таким образом, проверка всегда выполняется, целое число сохраняется каждый раз, поэтому in
и im
увеличиваются на 1 каждый раз и т. Д.
Мне нужно перетасовать массив чисел от 0 до n
Этот алгоритм не тот, который вам нужен: он вообще не тасует массив, он выдает упорядоченные случайные числа (а значит, уникальные), выбирая одно из возрастающих значений время от времени. Ограничение значений, как вы делаете, заставляет алгоритм выдавать все значения диапазона.
Вам повезет больше с Перемешивающим массивом в C