如何使用mysql用户定义的函数生成高斯分布

ted*_*uss 5 mysql statistics function gaussian

我喜欢使用MySQL进行定量分析和统计.我想创建一个MySQL用户定义的函数形式:sample_gaussian(mean,stdev),它返回从高斯分布中采样的单个随机值,该分布具有用户输入参数的均值和标准差.MySQL已经有一个函数rand()返回一个随机数,所以我只需要知道一些伪代码来约束/转换该值,使其落入正确的分布.有什么建议?

顺便说一句 - 这是我的第一个stackoverflow问题,所以如果这个问题在这个网站上询问太多用户,请原谅我.

ted*_*uss 10

在回答我自己的问题时,这是一个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 ;
Run Code Online (Sandbox Code Playgroud)

要验证这实际上是返回高斯分布,您可以生成一系列这些,然后绘制直方图:

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
Run Code Online (Sandbox Code Playgroud)

如果您在excel或选择的图形工具中绘制直方图,您将看到钟形正常曲线.