【发布时间】:2012-10-11 16:13:01
【问题描述】:
我知道这可以通过定义泪珠形状并接受落在该区域内的点(来自统一生成器)来完成。
我试图在 C++ 中通过生成两个统一的随机数 x 和 y 来定位点 (x,y),然后检查该点是否在该区域内。
我的代码本身没有问题,但我的逻辑是否存在缺陷?我还没有找到合适的图形方式来检查这是否是真正的正态分布。
这是应该工作的代码:
typedef unsigned long long int Ullong;
typedef double Doub;
struct Normaldev : Ran {
Doub mu,sig;
Normaldev (Doub mmu, Doub ssig, Ullong i)
: Ran (i), mu(mmu), sig(ssig){}
Doub dev() {
Doub u, v, x, y, q;
do {
u=Doub();
v=1.7156*(Doub()-0.5);
x=u-0.449871;
y=abs(v)+0.386595;
q=x*x+y*(0.19600*y-0.25472*x);
} while(q>0.27597 && (q>0.27846 || v*v>-4*log(u)*u*u));
return mu+sig*v/u;
}
};
我用我对 C++ 的基本知识尽可能多地更改了数字食谱书中建议的代码,但 Ran 到底应该是什么?
【问题讨论】:
-
通过夏皮罗测试检查分布是否正常。对于正态分布的 RoU 方法,在 Numerical Recipes 3rd edition 中有代码和数学。基本上,您使用边界椭圆来快速测试点 (x, y) 是否在区域内。
-
我已经阅读了那本书中的相关页面tinyurl.com/9oh2nqg,但我不确定我是否很好地掌握了它背后的理论。代码在 C 中?
-
代码是(坏的)C++。你不确定什么?从您最初的问题来看,在我看来您理解了该方法:只要 (x, y) 是泪滴区域的均匀样本,y/x 就是正态分布的。
-
我想编码的方式是:启动时间种子,将两个随机数滚动为 x 和 y,并根据它们是否符合 x=cos(t) 和y=sin(t)*sin(t/2) 泪滴参数。
标签: c++ random normal-distribution