Генерация случайного числа за исключением диапазона

Как вы генерируете случайное число в пределах диапазона, исключая при этом определенные диапазоны. Например. диапазон 1-10, но не 2-4 или 7. Решения, которые я использовал до сих пор:

  • Произведите случайный тест, если он находится в пределах запрещенного диапазона. На основе результата либо выведите число, либо повторите попытку.
  • Карта допустимых диапазонов к равномерному диапазону. Получите случайное число от 1 до 6, а затем отобразите обратно (т.е. 6 становится 10).
  • Создайте допустимые диапазоны (1-1,5-6,8-10). Произвольно выберите диапазон (при желании используйте веса) и число в выбранном диапазоне.

Каково ваше решение?

5 ответов

Решение

(б) Используйте единый диапазон и сопоставьте допустимые значения.

(а) Медленнее, а время работы недетерминировано, потому что вам нужно ждать, пока вы не получите число в нужном диапазоне. Если бы вы пропустили большой диапазон, вас бы не стало.

(в) является более сложным, чем (б); не добавляйте сложность, если это не требуется.

Сопоставьте их с итоговыми диапазонами, которые вы ожидаете. затем распределите их между диапазонами.

Например, если вам нужно случайное число от 0.10 до 100..110

Генерация случайного числа между 20. Младшие 10 присваиваются диапазону 0..10, остальные - другому интервалу (или что-то в этом роде - я могу быть на единицу. Арифметика интервала - одна из тех вещей, которые я никогда не получишь права с первой попытки).

Причина этого заключается в том, что вы часто имеете дело с несовершенными случайными генераторами. Они начинают вести себя странно, если вы распределяете последовательные переменные случайных чисел по нескольким измерениям (например, сначала выберите случайный интервал, затем выберите случайный внутри выбранного интервала). Это может привести к очень очевидному неслучайному поведению.

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

Это будет зависеть от того, сколько / большие диапазоны исключения. Тестирование на запрещенный диапазон (ваш вариант 1) будет хорошо работать для небольших наборов; Не нужно усложнять решение простой проблемы. Решение 3 будет работать лучше для более многочисленных наборов исключений. Решение 2 является наиболее трудоемким, но, вероятно, наиболее правильным теоретическим решением.

Я обычно использую технику, описанную в пуле номер два выше, особенно если набор допустимых чисел достаточно мал. С точки зрения статистики, это способ легко испортить случайность результатов или отклонить результаты от плоского распределения.

У него есть дополнительное преимущество, позволяющее один выбор (например, раздача карт или сбор шаров бинго) ... вы просто удаляете уже выбранные значения с карты.

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

Например, если вы хотите получить случайную серию чисел от 1 до 10, лучше начать с упорядоченной серии, смешать ее каким-то образом, например, путем замены (я думаю, что это был вопрос) и взять числа один за другим.

Другие вопросы по тегам