Другая возможность состояла бы в том, чтобы создать kd-дерево на Ваших данных, и затем ко чтобы обход дерева для получения упорядочивания. Построение kd-дерева только требует, чтобы у Вас был хороший находящий средний алгоритм, которого существуют многие.
Если метод Бокса-Мюллера возвращает "стандартное" нормальное распределение, оно будет иметь среднее значение 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)
.
Итак, сигма -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);