C++ 二维随机单位向量

C++ 二维随机单位向量,c++,random,vector,C++,Random,Vector,我想在二维空间中生成一个统一的随机单位向量,我在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和2Pi之间的随机角度,这是向量的“航向”。通过使用未标度的sin和

我想在二维空间中生成一个统一的随机单位向量,我在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和2Pi之间的随机角度,这是向量的“航向”。通过使用未标度的
sin
cos
,可以隐式假设向量的长度为1,并将其分解为垂直和水平分量。在我看来基本正确

一些小细节:1)当你除以
RAND_MAX
而不是
RAND_MAX+1
时,你允许同时出现0和x,在你的例子中是0和2Pi,这两个值在角度上是相同的。您可能需要相应地更改除数。2) 我建议将其乘以
2.0
而不是
2
,以避免在将其乘以
M_PI
时出现隐式上转换,但这可能是由编译器负责的


还有另一种方法可以推广到任意数量的维度:生成k元组(z1,z2,…,zk),其中每个z具有正态分布。计算范数N=sqrt(z12+z22+…+zk2),并使用它创建规范化向量X=(z1/N,z2/N,…,zk/N)。结果是X具有单位长度(因为归一化),并且由于法线的分布特性,其方向在k维单位超球体上均匀分布。

您基本上是在问如何生成介于0和
X之间的浮点数。此问题可能包含您的答案:注意,如果
RAND_MAX
是其类型的最大值,则除以
RAND_MAX+1
将有问题-请小心编写
(RAND_MAX+1.0)
或similar@MattMcNabb很好的观察。实际上,我建议完全避免使用
rand()。