線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2868
推到 Plurk!
推到 Facebook!

亂數取值機率的問題

尚未結案
hatemilk
一般會員


發表:3
回覆:3
積分:1
註冊:2003-08-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-21 19:11:21 IP:140.135.xxx.xxx 未訂閱
請問一下,在BCB裡面如何取到一組符合常態分配的亂數值, 也就是去出來的數值中,不管幾個,這些值的分佈會呈現, 越靠近0,則亂數值數目越多,越離開0亂數值的數目越少, 我要取的區間為0到1,我現在只會用random()函式, 但是這是均等分配,我用random(10001)/10000, 不過因為這是均等分配,所以random(10001)取出來的值, 0到10000的機率都是一樣, 請問一下有什麼方法或函式,可以讓我取的值,越靠近0則出現的機率越高。 請各位前輩不吝指導,謝謝。
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-21 23:37:53 IP:211.76.xxx.xxx 未訂閱
引言: 請問一下,在BCB裡面如何取到一組符合常態分配的亂數值, 也就是去出來的數值中,不管幾個,這些值的分佈會呈現, 越靠近0,則亂數值數目越多,越離開0亂數值的數目越少, 我要取的區間為0到1,我現在只會用random()函式, 但是這是均等分配,我用random(10001)/10000, 不過因為這是均等分配,所以random(10001)取出來的值, 0到10000的機率都是一樣, 請問一下有什麼方法或函式,可以讓我取的值,越靠近0則出現的機率越高。 請各位前輩不吝指導,謝謝。
hatemilk你好: 參考下面的code
 
double ia = RAND_MAX 1;
double ib = RAND_MAX 1-rand();
double a = log(ia/ib);
a出現的值的機率呈常態分佈,越靠近0則出現的機率越高。 90%的區間在0到2.3之間。(不代表出現的值就一定小於2.3)
hatemilk
一般會員


發表:3
回覆:3
積分:1
註冊:2003-08-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-25 01:44:08 IP:218.168.xxx.xxx 未訂閱
pwipwi謝謝你 不過有幾個地方不明白, double ia = RAND_MAX 1; double ib = RAND_MAX 1-rand(); double a = log(ia/ib); 如何解釋a的執會呈現常態分布,另外a的值是落在(0,2.3)之間嗎? 謝謝
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-25 03:37:47 IP:211.76.xxx.xxx 未訂閱
引言: pwipwi謝謝你 不過有幾個地方不明白, double ia = RAND_MAX 1; double ib = RAND_MAX 1-rand(); double a = log(ia/ib); 如何解釋a的執會呈現常態分布,另外a的值是落在(0,2.3)之間嗎? 謝謝
hatemilk你好: 我上面提供的亂數是"近似"常態分佈,讓0附近的機率較高,用的是exp的-x次方曲線。但那不是真正定義上的常態分佈曲線。真正定義上的,就要用高斯分佈,那是exp的-x*x次方曲線.....一個讓人頭大的東西… 如果你是實用取向,只是要做出讓
hatemilk
一般會員


發表:3
回覆:3
積分:1
註冊:2003-08-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-25 22:46:16 IP:140.135.xxx.xxx 未訂閱
pwipwi你好 我現在是一個企管所的學生,只懂得最基本的程式技巧, 因為我的論文與財務有關,主要內容是以一方程式模擬一種金融商品-選擇權 的理論價格, 這個式子要求指定一個符合常態分配的隨機亂數,區間為(-1,1), 我試過用random()函式,取均等分配的亂數值模擬, 不過模擬結果不合理,我認為這跟亂數值有關, 可以的話,請撥冗指導,謝謝。
StrongLemon
高階會員


發表:10
回覆:166
積分:105
註冊:2004-04-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-26 12:00:49 IP:221.169.xxx.xxx 未訂閱
hatemilk你好:    請參閱我寫的範例 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50762 看完之後繼續說明.. 所以只要設定同時投擲硬幣1000個,理論上可以幾乎達到常態分配。 然後以單次投擲ex正面=501次 將0~1000推移成-1~1 Z=(X-500)/500 這樣就可以讓你有趨近0的機率高的結果。
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-26 15:46:51 IP:211.76.xxx.xxx 未訂閱
引言: pwipwi你好 我現在是一個企管所的學生,只懂得最基本的程式技巧, 因為我的論文與財務有關,主要內容是以一方程式模擬一種金融商品-選擇權 的理論價格, 這個式子要求指定一個符合常態分配的隨機亂數,區間為(-1,1), 我試過用random()函式,取均等分配的亂數值模擬, 不過模擬結果不合理,我認為這跟亂數值有關, 可以的話,請撥冗指導,謝謝。
下面的code,是利用高斯分佈的函數設計出來的常態亂數,至於高斯分佈和相關的積分求值的問題,可能需要你自已去找相關的資料囉。 另外常態分佈是沒有絕對的區間的,只有像是90%的區間。至於你要的(-1,1) 到底是多少百分比,你要自已定義,然後再把常態曲線乘一個常數。下面的亂數用的是原本的高斯曲線中的常數。回傳的值是以0為中位數的,
float gasdev(void)
{
static int iset = 0;
static float gset;
float fac,rsq,v1,v2;
if(iset == 0)
        {
        do
                {
                v1 = 2.0 * rand() / RAND_MAX - 1.0;
                v2 = 2.0 * rand() / RAND_MAX - 1.0;
                rsq = v1*v1 v2*v2;
                }
        while(rsq >= 1.0 || rsq == 0.0);
        fac=sqrt(-2.0*log(rsq)/rsq);
        gset=v1*fac;
        iset=1;
        return v2*fac;
        }
else
        {
        iset = 0;
        return gset;
        }
}
hatemilk
一般會員


發表:3
回覆:3
積分:1
註冊:2003-08-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-26 17:08:02 IP:140.135.xxx.xxx 未訂閱
謝謝pwipwi跟StrongLemon 我再去試一下你們的方法,試完之後再向兩位報告。 謝謝。
系統時間:2024-07-01 6:38:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!