генерировать случайное число от 1 до x, где более низкое число более вероятно, чем более высокое - PullRequest
13 голосов
/ 21 июля 2010

Это больше вопрос математики / общего программирования, но я программирую на PHP, и это имеет значение.

Я думаю, что самый простой способ объяснить это на примере.

Если диапазон находится в диапазоне от 1 до 10.

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

Единственный способ, которым я могу думать, - это генерироватьмассив с 10 элементами, равными 1, 9 элементами, равными 2, 8 элементами, равными 3 ..... 1 элемент, равный 10. Затем генерируется случайное число на основе количества элементов.

Проблемая потенциально имею дело с 1 - 100000, и этот массив будет смехотворно большим.

Так как лучше это сделать?

Ответы [ 13 ]

0 голосов
/ 21 июля 2010

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

Например, для четного n вы можете сделать следующее: сгенерировать одно целое случайное число x от 1 до n / 2 и сгенерировать второе число от 1 до n + 1. Если y> x, вы генерируете x, иначе вы генерируете n-x + 1. Это должно дать вам дистрибутив в вашем примере.

0 голосов
/ 21 июля 2010

Вообще говоря, похоже, что вы хотите нарисовать случайное число из распределения Пуассона , а не из [равномерного распределения] (http://en.wikipedia.org/wiki/Uniform_distribution_(continuous)). На приведенной выше вики-странице есть раздел в котором конкретно указано, как вы можете использовать непрерывное распределение для генерации псевдопуассоновского распределения ... проверить это . Обратите внимание, что вы можете проверить различные значения λ, чтобы убедиться, что распределение работает так, как вам нужно к.

0 голосов
/ 21 июля 2010

Что вам нужно сделать, это сгенерировать случайное число в большем интервале (предпочтительно с плавающей запятой) и отобразить его в [1,10] неравномерным образом. Точно, какой путь зависит от , насколько гораздо более вероятно, что вы хотите, чтобы 1 была чем 9 или 10.

Для решений на языке C см. эти библиотеки . Вы можете найти использование для этого в PHP .

...