作者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