2010-03-02 76 views
5

我喜歡用MySQL做定量分析和統計。 我想做一個MySQL用戶定義的函數,形式如下: sample_gaussian(mean,stdev)返回一個隨機化的 值,採用高斯分佈,其平均值和標準差爲用戶輸入參數的 。 MySQL已經有一個 函數rand()返回一個隨機數,所以我只需要 知道一些僞代碼來約束/轉換該值 ,以便它落入正確的分佈。 有什麼建議嗎?如何用mysql自定義函數生成高斯分佈

順便說一句,這是我的第一個計算器的問題,所以請原諒 我,如果這個問題是要求太多的用戶在這個網站上。

回答

8

回答我自己的問題,這裏是一個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或繪圖工具選擇,你會看到鐘形的正常曲線。

2

rand()返回一個0到1之間的均勻分佈的隨機變量(您應該驗證這一點,因爲我不確定 - 這是它在Sybase中的工作原理)。您可以使用rand()生成一個或多個正態分佈的隨機變量r,其平均值爲零,標準偏差(和方差)爲1,即r〜N(0,1),執行上述方法之一。here

你已經從N(0,1)產生了一個隨機變量,你可以去標準化它(解決公式here中的X),從N(my_mean,my_std)中得到一個隨機變量,即將其乘以my_std,然後添加my_mean。

+1

sitmo.com鏈接不工作 – vbence 2013-02-07 09:01:42

+0

維基百科在這裏列出算法列表:http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution – 2013-02-08 10:19:15

1

Box-Muller變換是一種使用基本函數生成標準正態隨機變量的方法。它每次產生兩個,這有時浪費,但我覺得它非常優雅。