作者a5170040 (Piggy)
看板C_and_CPP
標題[問題] 模擬太多次加起來會跑到無限大?
時間Thu Mar 19 02:45:58 2009
最近在寫模擬的東西
發現到模擬寫常態分配的時候(假設模擬1000000)
用Box Muller可以正確產生亂數
但是累加起來卻會跑到無窮 我的sum1=sum1+N[i]
EX:
N[200010]=2.24376 sum[200010]=-1.#INF
N[200011]=1.13556 sum[200011]=-1.#INF
N[200012]=-0.245738 sum[200012]=-1.#INF
N[200013]=0.502558 sum[200013]=-1.#INF
這種情況在我跑比較少的樣本的時候不會出現(100000都還OK)
有趣的是我用其它的方法產生亂數(譬如rejection方法)
但是累加不會有問題
我想請問的是Box Muller在跑大量模擬累加的時候出現了什麼問題?
底下是我Normal的程式碼
double normal(double m,double v)//Box-Muller
{
double u1,u2,z;
u1 = uniform(0,1);
u2 = uniform(0,1);
z = m + sqrt(-2*log(u1))*cos(2*pi*(u2))*sqrt(v);
return z;
}
可以幫忙小的解決這個困擾嗎?謝謝!!!
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.191.166
※ 編輯: a5170040 來自: 140.113.191.166 (03/19 02:46)
1F:推 POSIX:會不會是sqrt()內的值太大, 先個別sqr() 之後再相乘會過嗎? 03/19 03:03
2F:→ a5170040:我把sqrt()拿掉還是一樣耶@@ 03/19 03:05
3F:推 POSIX:幫你debug 你人跑掉? -_-|| 03/19 04:33
4F:→ MOONRAKER:-1.#INF是叫無限小 不是無限大 03/19 07:51
5F:→ MOONRAKER:根據印象,這是你Box-Muller的公式有被偷改或你自己改 03/19 07:52
6F:→ MOONRAKER:掉其中某係數所致,再找別的參考資料確定正確寫法 03/19 07:53
7F:推 POSIX:他的問題出在uniform()裡面的rand的東西弄錯 03/19 08:16
8F:→ latinboy: 參考#17SH4XHv 小心log裡面遇到0的case 03/19 09:54
9F:→ a5170040:謝謝!!!P大對不起...昨天宿網突然斷掉@@ 03/19 11:06
10F:→ a5170040:解決了...謝謝P大 03/19 23:14