亂數取值機率的問題 |
尚未結案
|
hatemilk
一般會員 發表:3 回覆:3 積分:1 註冊:2003-08-20 發送簡訊給我 |
請問一下,在BCB裡面如何取到一組符合常態分配的亂數值,
也就是去出來的數值中,不管幾個,這些值的分佈會呈現,
越靠近0,則亂數值數目越多,越離開0亂數值的數目越少,
我要取的區間為0到1,我現在只會用random()函式,
但是這是均等分配,我用random(10001)/10000,
不過因為這是均等分配,所以random(10001)取出來的值,
0到10000的機率都是一樣,
請問一下有什麼方法或函式,可以讓我取的值,越靠近0則出現的機率越高。
請各位前輩不吝指導,謝謝。
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
引言: 請問一下,在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 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
StrongLemon
高階會員 發表:10 回覆:166 積分:105 註冊:2004-04-18 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |