看板 C_and_CPP 關於我們 聯絡資訊
最近在寫模擬的東西 發現到模擬寫常態分配的時候(假設模擬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)
POSIX:會不會是sqrt()內的值太大, 先個別sqr() 之後再相乘會過嗎? 03/19 03:03
a5170040:我把sqrt()拿掉還是一樣耶@@ 03/19 03:05
POSIX:幫你debug 你人跑掉? -_-|| 03/19 04:33
MOONRAKER:-1.#INF是叫無限小 不是無限大 03/19 07:51
MOONRAKER:根據印象,這是你Box-Muller的公式有被偷改或你自己改 03/19 07:52
MOONRAKER:掉其中某係數所致,再找別的參考資料確定正確寫法 03/19 07:53
POSIX:他的問題出在uniform()裡面的rand的東西弄錯 03/19 08:16
latinboy: 參考#17SH4XHv 小心log裡面遇到0的case 03/19 09:54
a5170040:謝謝!!!P大對不起...昨天宿網突然斷掉@@ 03/19 11:06
a5170040:解決了...謝謝P大 03/19 23:14