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

0

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

Во-первых, у меня есть этот код для размещения случайных чисел 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
    Если вы действительно знаете, как случайным образом перемешать вектор, это должно быть тривиально. Правильное перемешивание ( en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle ) не включает проверку наличия элемента.
  • 0
    Извините, я имел в виду тасование, как это std :: random_shuffle (v.begin (), v.end ()), но это не очень помогает с моей проблемой ... Я должен был опустить это в моем посте ^^
Показать ещё 1 комментарий
Теги:
vector
integer
random
fill

2 ответа

3
Лучший ответ

Вы можете заполнить свой вектор значениями 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]);
}
  • 0
    Но что, если пул чисел, скажем, 8 чисел (от 0 до 7), а размер вектора должен быть только, скажем, 5. Тогда у вектора будут только перемешанные числа от 0 до 4, верно? Или я ошибаюсь
  • 2
    Если это так, вы можете создать вектор размером 7, перемешать его и скопировать первые 5 значений с индексами [0-5]. Или, если вы хотите, вы можете просто изменить свой вектор до 5.
Показать ещё 3 комментария
2

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

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

  • 1
    Спасибо за ваш ответ. Я ценю ваши усилия, но это звучит немного сложно для меня (я новичок). Я выбрал это решение: создайте вектор со всеми подходящими целочисленными значениями, перетасуйте его и вставьте первые значения <numberOfSlots> в конечный вектор. Я не знаю, эффективно это или нет, но это работает; P

Ещё вопросы

Сообщество Overcoder
Наверх
Меню