我喜歡用MySQL做定量分析和統計。 我想做一個MySQL用戶定義的函數,形式如下: sample_gaussian(mean,stdev)返回一個隨機化的 值,採用高斯分佈,其平均值和標準差爲用戶輸入參數的 。 MySQL已經有一個 函數rand()返回一個隨機數,所以我只需要 知道一些僞代碼來約束/轉換該值 ,以便它落入正確的分佈。 有什麼建議嗎?如何用mysql自定義函數生成高斯分佈
順便說一句,這是我的第一個計算器的問題,所以請原諒 我,如果這個問題是要求太多的用戶在這個網站上。
我喜歡用MySQL做定量分析和統計。 我想做一個MySQL用戶定義的函數,形式如下: sample_gaussian(mean,stdev)返回一個隨機化的 值,採用高斯分佈,其平均值和標準差爲用戶輸入參數的 。 MySQL已經有一個 函數rand()返回一個隨機數,所以我只需要 知道一些僞代碼來約束/轉換該值 ,以便它落入正確的分佈。 有什麼建議嗎?如何用mysql自定義函數生成高斯分佈
順便說一句,這是我的第一個計算器的問題,所以請原諒 我,如果這個問題是要求太多的用戶在這個網站上。
回答我自己的問題,這裏是一個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或繪圖工具選擇,你會看到鐘形的正常曲線。
Box-Muller變換是一種使用基本函數生成標準正態隨機變量的方法。它每次產生兩個,這有時浪費,但我覺得它非常優雅。
sitmo.com鏈接不工作 – vbence 2013-02-07 09:01:42
維基百科在這裏列出算法列表:http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution – 2013-02-08 10:19:15