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