Как обычно генерировать распределенный случайный от целочисленного диапазона?

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

10
задан 20 August 2009 в 16:50
поделиться

2 ответа

Если метод Бокса-Мюллера возвращает "стандартное" нормальное распределение, оно будет иметь среднее значение 0 и стандартное отклонение 1. Чтобы преобразовать стандартное нормальное распределение, вы умножаете свое случайное число на X, чтобы получить стандартное отклонение X, и вы добавляете Y, чтобы получить среднее значение Y, если память мне не изменяет.

См. раздел Википедии о нормализации стандартных нормальных переменных (свойство 1) для более формального доказательства.


] В ответ на ваш комментарий, эмпирическое правило состоит в том, что 99,7% нормального распределения будет в пределах +/- 3-кратного стандартного отклонения. Если вам нужно, например, нормальное распределение от 0 до 100, тогда ваше среднее будет наполовину, а ваше стандартное отклонение будет (100/2) / 3 = 16,667. Итак, какие бы значения вы ни получили из своего алгоритма Бокса-Мюллера, умножьте его на 16,667, чтобы «растянуть». раздачу, затем добавьте 50, чтобы «центрировать» его.


Джон, в ответ на ваш последний комментарий, я действительно не уверен, в чем смысл функции Next . Он всегда использует стандартное отклонение 1 и среднее значение на полпути между минимальным и максимальным значением.

Если вы хотите получить среднее значение Y, с ~ 99,7% чисел в диапазоне от -X до + X, вы просто вызываете BoxMuller (Y, X / 3) .

6
ответ дан 4 December 2019 в 02:50
поделиться

Итак, сигма -2 * .. + 2 * сигма даст вам 95% кривой колокола. (проверьте раздел «Стандартное отклонение и доверительные интервалы» в уже упомянутой вики-статье).

Так что измените этот фрагмент:

return (int)BoxMuller(min + (max - min) / 2.0, 1.0);

и измените 1.0 (стандартное отклонение) на 2.0 (или даже больше, если вы хотите больше 95%) покрытие)

return (int)BoxMuller(min + (max - min) / 2.0, 2.0);
1
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: