Как генерировать гауссовское распределение с использованием пользовательской функции mysql

Мне нравится использовать MySQL для количественного анализа и статистики. Я хотел бы сделать пользовательскую функцию MySQL в форме: sample_gaussian (mean, stdev), который возвращает одно рандомизированное значение, выбранное из гауссового распределения со средним и стандартным отклонение введенных пользователем аргументов. MySQL уже имеет функция rand(), которая возвращает случайное число, поэтому мне просто нужно знать некоторый псевдокод для ограничения/преобразования этого значения так что он попадает в правильное распределение. Любые предложения?

BTW- Это мой первый вопрос о стеке, поэтому, пожалуйста, простите если этот вопрос задает слишком много пользователей на этом сайте.

Ответ 1

В ответ на мой собственный вопрос, вот пользовательская функция MySQL, которая возвращает одно случайное значение, выбранное из гауссовского распределения с заданным средним и стандартным отклонением.

DROP FUNCTION IF EXISTS gauss;
DELIMITER //
CREATE FUNCTION gauss(mean float, stdev float) RETURNS float
BEGIN
set @x=rand(), @y=rand();
set @gaus = ((sqrt(-2*log(@x))*cos(2*pi()*@y))*stdev)+mean;
return @gaus;
END
//
DELIMITER ;

Чтобы убедиться, что это фактически возвращает гауссовское распределение, вы можете сгенерировать серию из них, а затем построить гистограмму:

create temporary table temp (id int, rando float);
insert into temp (rando) select gauss(2,1); # repeat this operation 500 times
insert into temp (rando) select gauss(2,1) from any_table_with_500+_entries limit 500;
select round(temp,1), count(*) from temp group by round(temp,1) # creates a histogram

Если вы нарисуете эту гистограмму в специальном инструменте выбора или графике, вы увидите нормальную форму колокола.

Ответ 2

rand() возвращает равномерно распределенную случайную переменную между 0 и 1 (вы должны это проверить, потому что я не уверен - так оно работает в Sybase). Вы можете использовать rand() для генерации одной или более нормально распределенных случайных величин r со средним нулем и стандартным отклонением (и дисперсией), т.е. R ~ N (0,1), реализуя один из указанных методов здесь

Когда вы создали случайную переменную из N (0,1), вы можете де-стандартизировать ее (решить для X в формуле здесь), чтобы получить случайную переменную из N (my_mean, my_std), то есть путем умножения ее на my_std и затем добавления my_mean.

Ответ 3

Трансформация Box-Muller - способ генерации стандартных нормальных случайных вариаций с использованием элементарных функций. Он генерирует два за раз, что иногда расточительно, но я нахожу его очень элегантным.