Заполнить вектор случайными уникальными целыми числами из фиксированного пула чисел

Я хочу заполнить вектор случайными целыми числами, но в нем не может быть дубликатов.

Во-первых, у меня есть этот код, чтобы поставить numberOfSlots случайные целые числа от 0 до 7 в векторе (numberOfSlots может быть от 2 до 20):

srand((unsigned int)time(NULL));
unsigned int min = 0;
unsigned int max = 7;
std::vector<unsigned int> v;

for (int i = 0; i < numberOfSlots; i++) {
unsigned int rdm = std::rand() % (max - min + 1) + min;
v.push_back(rdm);
}

Это код, когда допускаются повторяющиеся целые числа. Это работает нормально!

Теперь я хочу изменить этот код так, чтобы из того же случайного пула возможных целых чисел (мин в Максимум) сгенерированное случайное целое число добавляется, только если его еще нет в векторе.

Так что если, например, numberOfSlots 5, то вектор будет иметь 5 записей, которые были случайно выбраны из пула, но не совпадают, например, 7, 1, 3, 5, 0. Если numberOfSlots равно 8, вектор будет, например, 3, 1, 2, 7, 6, 0, 4, 5.

Я знаю, как перетасовать вектор и прочее, но я не могу заставить это работать. Я думаю, что я должен использовать цикл while и проверять все уже существующие целые числа в векторе по отношению к новому случайному числу, которое будет добавлено, и, если оно уже есть, генерирует новое случайное число и проверяет снова и т. Д., Но я не знаю

Я новичок, и это действительно сложно. Может кто-нибудь может дать мне подсказку? Я был бы признателен … большое спасибо

0

Решение

Вы можете заполнить свой вектор значениями 0..N-1 (или значениями вашего пула) и затем перемешать его. Смотрите пример:

// Initialize
for(i = 0; i < N; i++)
arr[i] = i;

// shuffle
for(i = N - 1; i > 0; i--) {
j = rand() % i;
swap(arr[i], arr[j]);
}
3

Другие решения

Я думаю, что вам лучше всего создать вектор для хранения нерандомизированных целых чисел, а затем еще один вектор для хранения рандомизированного подмножества.

случайным образом выберите число из вашего нерандомизированного целочисленного вектора, добавьте это число к рандомизированному вектору подмножеств, а затем удалите его из нерандомизированного целочисленного вектора.

Теперь ваш нерандомизированный целочисленный вектор стал на один меньший, поэтому случайным образом выберите число в новом меньшем векторе, добавьте его в вектор рандомизированного подмножества и удалите его из нерандомизированного вектора. Повторение.

Вот как это может выглядеть


Unrandomized

{0, 1, 2, 3, 4, 5, 6, 7}

Рандомизированное

{}

Выберите случайный индекс: 5

Урожайность =>


Unrandomized

{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5

Рандомизированное

{5}

Выберите случайный индекс: 0

Урожайность =>


Unrandomized

{1, 2, 3, 5, 6, 7}

Рандомизированное

{5, 0}

Выберите случайный индекс: 6

Урожайность =>


Unrandommized

{1, 2, 3, 5, 6} // 7 removed at index #6

Рандомизированное

{5, 0, 7}

И скажем, вам нужно только выбрать здесь 3 случайных значения, чтобы в итоге вы получили 5, 0, 7. Этот метод гарантирует отсутствие дубликатов. Я думаю, что есть более простой способ с использованием встроенной функции, но я не знаю, и выше должно быть достаточно.

2

По вопросам рекламы [email protected]