Генерация случайного числа за исключением диапазона - PullRequest
6 голосов
/ 13 октября 2008

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

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

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

Ответы [ 5 ]

8 голосов
/ 13 октября 2008

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

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

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

1 голос
/ 13 октября 2008

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

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

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

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

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

1 голос
/ 13 октября 2008

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

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

1 голос
/ 13 октября 2008

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

0 голосов
/ 13 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...