#c #c 17
Вопрос:
Я хочу назначить случайное число переменной объекта, а для объектов случайное число не должно совпадать с переменной любого другого объекта.
Я написал код для генерации случайного числа между диапазонами, но он повторяется. Итак, я хочу исправить ситуацию.
Комментарии:
1. Если это не может повториться, значит, это не «случайно». Это перетасовка некоторого диапазона чисел. В этот момент, почему бы просто не увеличить целое число? Действительно ли имеет значение, что он выбирает случайным образом из диапазона?
2. @NicolBolas также кажется, что диапазон, о котором он говорит, довольно низок, так как было бы не так просто повторить, если бы он был размером UUID v4
3. Симулятор лотерейного мяча. Лотерейные билеты. Я уверен, что гораздо больше. Для этого есть причины, по которым вы хотите, чтобы числа располагались в случайном порядке, но не повторялись, так что это не ужасный вопрос.
4. @KevinAnderson ИМО отслеживание сгенерированных нуберов в виде набора может быть лучшим подходом
5. @majkrzak «Я написал код для генерации случайного числа между диапазонами, но он повторяется». конечно, я могу прочитать вопросы до конца. Может быть, ты это пропустил? Как бы то ни было, на этот вопрос на самом деле невозможно ответить без просмотра кода, наиболее вероятная причина, по которой операция видит такое поведение, описана в дубликате. Вы можете проголосовать за повторное открытие, прежде чем оскорблять других здесь, хорошо?
Ответ №1:
Существует несколько решений в зависимости от диапазона необходимых вам индексов.
Если он довольно мал, просто сгенерируйте вектор всех значений и перетасуйте его
std::vectorlt;size_tgt; indices(index_count); std::iota(indices.begin(), indices.end(), 0); std::random_shuffle(indices.begin(), indices.end()); // Or std::shuffle with custom RNG.
Следующее решение — сохранить сгенерированные до сих пор индексы.
std::unordered_setlt;size_tgt; indices; size_t generate(std::unordered_setlt;size_tgt;amp; indices) { while (true) { size_t index = ...; // Generate a possibly repeating index. if (indices.insert(index).second) { // .insert(...).second checks whether the value is new in set. return index; } } }
Последнее решение состоит в использовании генератора псевдослучайных чисел, который, как можно математически доказать, не повторяется (до некоторого большого количества вызовов).