Я хочу заполнить вектор случайными целыми числами, но в нем не может быть дубликатов.
Во-первых, у меня есть этот код, чтобы поставить 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..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]);
}
Я думаю, что вам лучше всего создать вектор для хранения нерандомизированных целых чисел, а затем еще один вектор для хранения рандомизированного подмножества.
случайным образом выберите число из вашего нерандомизированного целочисленного вектора, добавьте это число к рандомизированному вектору подмножеств, а затем удалите его из нерандомизированного целочисленного вектора.
Теперь ваш нерандомизированный целочисленный вектор стал на один меньший, поэтому случайным образом выберите число в новом меньшем векторе, добавьте его в вектор рандомизированного подмножества и удалите его из нерандомизированного вектора. Повторение.
Вот как это может выглядеть
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. Этот метод гарантирует отсутствие дубликатов. Я думаю, что есть более простой способ с использованием встроенной функции, но я не знаю, и выше должно быть достаточно.