二维随机单位向量

时间:2014-07-30 14:20:49

标签: c++ random vector

我想在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);

这是对的吗?

1 个答案:

答案 0 :(得分:1)

你在0到2Pi之间统一生成一个随机角度phi,这是你矢量的“标题”。通过使用未缩放的sincos,您隐式假设向量的长度为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维单位超球面上。