Допустим, я хочу создать набор случайных чисел из интервала (a, b)
. Сгенерированная последовательность также должна иметь свойство сортировки. Я могу придумать два способа добиться этого.
Позвольте n
быть длина последовательности, которая будет сгенерирована.
1-й алгоритм:
Let `offset = floor((b - a) / n)`
for i = 1 up to n:
generate a random number r_i from (a, a+offset)
a = a + offset
add r_i to the sequence r
2-й алгоритм:
for i = 1 up to n:
generate a random number s_i from (a, b)
add s_i to the sequence s
sort(r)
У меня вопрос: дает ли алгоритм 1 последовательности, которые так же хороши, как последовательности, сгенерированные алгоритмом 2?
random-generation
ultrajohn
источник
источник
R
. Для того , чтобы генерировать массив наборов случайных чисел над равномерным интервалом , следующий код работает: . n [ a , b ]rand_array <- replicate(k, sort(runif(n, a, b))
Ответы:
Первый алгоритм плохо работает по двум причинам:
Взятие пола может значительно уменьшить его. Действительно, когда , он будет равен нулю, давая вам набор, значения которого одинаковы!(a−b)/n b−a<n
Когда вы не берете слово, полученные значения распределяются слишком равномерно . Так , например, в любой простой случайной выборке из н.о.р. равномерного переменные (скажем , между и ), есть вероятности того, что Наибольшее не будет в верхнем интервале от до . При использовании алгоритма 1 существует вероятность того, что максимум будет в этом интервале. Для некоторых целей эта супер-однородность хороша, но в целом это ужасная ошибка, потому что (а) многие статистические данные будут разрушены, но (б) может быть очень трудно определить, почему.n a=0 b=1 (1−1/n)n≈1/e≈37% 1−1/n 1 100%
Если вы хотите избежать сортировки, генерируйте независимых экспоненциально распределенных переменных. Нормализовать их совокупную сумму в диапазоне путем деления на сумму. Удалите наибольшее значение (которое всегда будет ). Масштабируйте до диапазона .n+1 (0,1) 1 (a,b)
Гистограммы всех трех алгоритмов показаны. (Каждый показывает совокупные результаты независимых наборов значений каждый.) Отсутствие каких-либо видимых изменений в гистограмме для Алгоритма 1 показывает проблему там. Различия в двух других алгоритмах - это именно то, что следует ожидать - и то, что вам нужно от генератора случайных чисел.1000 n=100
Более многие (забавные) способы моделирования независимых равномерных переменных см. В разделе « Моделирование рисунков из равномерного распределения с использованием рисунков из нормального распределения» .
Вот
R
код, который произвел рисунок.источник
Первый алгоритм производства слишком равномерно распределенных чисел
Смотрите также серию с низким расхождением .
Предполагая, что вы хотите 2 случайных числа в . При реальных единообразных данных вероятность составляет 50:50, они оба больше или меньше 0,5 одновременно. При вашем подходе вероятность равна 0. Таким образом, ваши данные не единообразны.[0;1]
(Как указывалось, это может быть желательным свойством, например, для стратификации. Ряды с низким расхождением, такие как Halton и Sobel , имеют свои варианты использования.)
Правильный, но дорогой подход (для реальных ценностей)
... это использовать бета-распределенные случайные числа. Статистика порядка ранга равномерного распределения является бета-распределенной. Вы можете использовать это, чтобы случайным образом нарисовать наименьшее , затем второе наименьшее, ... повторить.
Предполагая, что данные должны быть сгенерированы в . Наименьшее значение - это . (Для последующих случаев уменьшите и измените масштаб до оставшегося интервала). Чтобы сгенерировать общую бета-случайность, нам нужно сгенерировать два гамма-распределенных случайных значения. Но . Тогда . Для этого мы можем выбрать случайные числа из этого распределения как .[0;1] Beta[1,n] n 1−X∼Beta[n,1] −ln(1−X)∼Exponential[n] −ln(U[0;1])n
Что дает следующий алгоритм:
Это может быть связано с численной нестабильностью, и вычисление
pow
и деление для каждого объекта могут оказаться медленнее, чем сортировка.Для целочисленных значений вам может понадобиться другой дистрибутив.
Сортировка невероятно дешева, так что просто используйте ее
Но не беспокойся. Сортировка настолько смехотворно дешева, так что просто сортируйте. За прошедшие годы мы хорошо поняли, как реализовать алгоритмы сортировки, которых не стоит избегать сортировки по двойникам. Теоретически это но постоянный член настолько смехотворно мал в хорошей реализации, что это прекрасный пример того, как бесполезные результаты теоретической сложности могут быть. Запустите тест. Создайте 1 миллион случайностей с сортировкой и без нее. Запустите его несколько раз, и я не удивлюсь, если довольно часто сортировка превосходит несортировку, потому что стоимость сортировки все равно будет намного меньше, чем ваша ошибка измерения.O(nlogn)
источник
Это также зависит от того, что вы делаете со случайными числами. Для задач численного интегрирования один метод (при исправлении путем удаления оператора этажа) даст превосходный набор точек. То, что вы делаете, является формой стратифицированной выборки, и она имеет то преимущество, что избегает слипания. например, невозможно получить все ваши значения в диапазоне 0- (ba) / n. Тем не менее, для других приложений это может быть очень плохо, это зависит от того, что вы хотите с ним делать.
источник