[問題] 模擬太多次加起來會跑到無限大?

看板C_and_CPP作者 (Piggy)時間15年前 (2009/03/19 02:46), 編輯推噓3(307)
留言10則, 4人參與, 最新討論串1/1
最近在寫模擬的東西 發現到模擬寫常態分配的時候(假設模擬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)

03/19 03:03, , 1F
會不會是sqrt()內的值太大, 先個別sqr() 之後再相乘會過嗎?
03/19 03:03, 1F

03/19 03:05, , 2F
我把sqrt()拿掉還是一樣耶@@
03/19 03:05, 2F

03/19 04:33, , 3F
幫你debug 你人跑掉? -_-||
03/19 04:33, 3F

03/19 07:51, , 4F
-1.#INF是叫無限小 不是無限大
03/19 07:51, 4F

03/19 07:52, , 5F
根據印象,這是你Box-Muller的公式有被偷改或你自己改
03/19 07:52, 5F

03/19 07:53, , 6F
掉其中某係數所致,再找別的參考資料確定正確寫法
03/19 07:53, 6F

03/19 08:16, , 7F
他的問題出在uniform()裡面的rand的東西弄錯
03/19 08:16, 7F

03/19 09:54, , 8F
參考#17SH4XHv 小心log裡面遇到0的case
03/19 09:54, 8F

03/19 11:06, , 9F
謝謝!!!P大對不起...昨天宿網突然斷掉@@
03/19 11:06, 9F

03/19 23:14, , 10F
解決了...謝謝P大
03/19 23:14, 10F
文章代碼(AID): #19mK5eXZ (C_and_CPP)