Первый алгоритм производства слишком равномерно распределенных чисел
Смотрите также серию с низким расхождением .
Предполагая, что вы хотите 2 случайных числа в . При реальных единообразных данных вероятность составляет 50:50, они оба больше или меньше 0,5 одновременно. При вашем подходе вероятность равна 0. Таким образом, ваши данные не единообразны.[0;1]
(Как указывалось, это может быть желательным свойством, например, для стратификации. Ряды с низким расхождением, такие как Halton и Sobel , имеют свои варианты использования.)
Правильный, но дорогой подход (для реальных ценностей)
... это использовать бета-распределенные случайные числа. Статистика порядка ранга равномерного распределения является бета-распределенной. Вы можете использовать это, чтобы случайным образом нарисовать наименьшее , затем второе наименьшее, ... повторить.
Предполагая, что данные должны быть сгенерированы в . Наименьшее значение - это . (Для последующих случаев уменьшите и измените масштаб до оставшегося интервала). Чтобы сгенерировать общую бета-случайность, нам нужно сгенерировать два гамма-распределенных случайных значения. Но . Тогда . Для этого мы можем выбрать случайные числа из этого распределения как .[0;1]Beta[1,n]n1−X∼Beta[n,1]−ln(1−X)∼Exponential[n]−ln(U[0;1])n
−ln(1−x)1−xx=−ln(1−u)n=u1n=1−u1n
Что дает следующий алгоритм:
x = a
for i in range(n, 0, -1):
x += (b-x) * (1 - pow(rand(), 1. / i))
result.append(x)
Это может быть связано с численной нестабильностью, и вычисление pow
и деление для каждого объекта могут оказаться медленнее, чем сортировка.
Для целочисленных значений вам может понадобиться другой дистрибутив.
Сортировка невероятно дешева, так что просто используйте ее
Но не беспокойся. Сортировка настолько смехотворно дешева, так что просто сортируйте. За прошедшие годы мы хорошо поняли, как реализовать алгоритмы сортировки, которых не стоит избегать сортировки по двойникам. Теоретически это но постоянный член настолько смехотворно мал в хорошей реализации, что это прекрасный пример того, как бесполезные результаты теоретической сложности могут быть. Запустите тест. Создайте 1 миллион случайностей с сортировкой и без нее. Запустите его несколько раз, и я не удивлюсь, если довольно часто сортировка превосходит несортировку, потому что стоимость сортировки все равно будет намного меньше, чем ваша ошибка измерения.O(nlogn)
R
. Для того , чтобы генерировать массив наборов случайных чисел над равномерным интервалом , следующий код работает: . n [ a , b ]rand_array <- replicate(k, sort(runif(n, a, b))