5

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

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

4

3 回答 3

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 ;

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

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

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

于 2010-03-03T15:15:52.243 回答
2

rand() 返回一个介于 0 和 1 之间的均匀分布的随机变量(您应该验证这一点,因为我不确定 - 这就是它在 Sybase 中的工作方式)。您可以使用 rand() 生成一个或多个正态分布随机变量 r,其均值为 0,标准差(和方差)为 1,即 r ~ N(0,1),实现此处提到的方法之一

当您从 N(0,1) 生成随机变量时,您可以对其进行反标准化(在此处的公式中求解 X )以从 N(my_mean,my_std) 中获取随机变量,即将其乘以 my_std然后添加 my_mean。

于 2010-03-02T14:41:02.313 回答
1

Box-Muller变换是一种使用基本函数生成标准正态随机变量的方法。它一次生成两个,这有时很浪费,但我觉得它非常优雅。

于 2010-03-03T06:28:06.417 回答