我想在2维中生成一个统一的随机单位向量,我在C ++中使用了以下代码段
double ranf(double x)
{
return double(rand()) * x / (double(RAND_MAX));
}
double phi = ranf(2 * M_PI);
double ndx = cos(phi);
double ndy = sin(phi);
这是对的吗?
答案 0 :(得分:1)
你在0到2Pi之间统一生成一个随机角度phi
,这是你矢量的“标题”。通过使用未缩放的sin
和cos
,您隐式假设向量的长度为1并将其分解为垂直和水平分量。看起来对我来说基本正确。
一些细微的细节:1)当你除以RAND_MAX
而不是RAND_MAX+1
时,你允许零和x都出现,在你的情况下,0和2Pi,以及那两个角度方面的值是相同的。您可能希望相应地更改除数。 2)我建议乘以2.0
而不是2
,以避免在将它乘以M_PI
时隐式向上转换,但这可能是您的编译器完成的。
还有另一种方法可以推广到任意数量的维度:生成k元组(z 1 ,z 2 ,...,z k )其中每个z具有正态分布。计算范数N = sqrt(z 1 2 + z 2 2 + ... + z k 2 ),并用它来创建一个归一化向量X =(z 1 / N,z 2 / N ,...,z k / N)。结果是X具有单位长度(由于归一化),并且由于法线的分布特性,其方向均匀分布在k维单位超球面上。