如何生成欧几里得长度为 1 的随机均匀分布向量?

How to generate random uniformly distributed vectors of euclidian length of one?

我正在尝试随机生成欧几里德长度为 1 的均匀分布向量。均匀分布是指向量的每个条目(坐标)均匀分布。

更具体地说,我想创建一组,比如说,1000 个向量(让我们称它们为 V_i,i=1,…,1000),其中每个随机向量都有单位欧几里得长度和相同的维度 V_i=(v_1i,…,v_ni)'(假设 n = 5,但该算法应该适用于任何维度)。如果我们然后查看例如的分布v_1i,每个V_i的第一个元素,那么我希望这是均匀分布的。

在附带的 MATLAB 示例中,您会看到您不能简单地从均匀分布中抽取随机向量,然后将向量归一化为欧几里德长度 1,因为元素在向量中的分布不再均匀。

有没有办法生成这组向量,使得单个元素在整个向量集中的分布是均匀的?

感谢您的任何想法。

PS:MATLAB 是我们选择的语言,但当然欢迎任何语言的解决方案。

clear all
   rng('default')
   
   nvar=5;
   sample = 1000;
   
   x = zeros(nvar,sample);
   
   for ii = 1:sample
       
       y=rand(nvar,1);  
       x(:,ii) = y./norm(y);
       
   end
   
   hist(x(1,:))
   figure
   hist(x(2,:))
   figure

   hist(x(3,:))
   figure
   hist(x(4,:))
   figure
   hist(x(5,:))

你想要的无法实现

长度为 1 的向量位于一个圆(或球体或超球体,具体取决于维数)上。让我们专注于 2D 的情况,如果它不能在那里完成,那么很明显它也不能用更多的维度来完成。

因为点在一个圆上,它们的x和y坐标是相关的,一个可以根据另一个来计算。因此,不能独立定义 x 和 y 坐标的分布。我们可以定义一个的分布,为它生成随机值,但是另一个坐标必须从第一个开始计算。

让我们在一个具有统一 x 坐标的半圆上画点(可以通过向 y 坐标添加一个随机符号来扩展到一个完整的圆):

N = 1000;
x = 2 * rand(N,1) - 1;
y = sqrt(1 - x.^2);
plot(x,y,'.')
axis equal
histogram(y)

绘图生成的分布明显不均匀,在 y=1 附近生成的样本比在 y=0 附近生成的样本多得多。如果我们在 y 坐标上添加一个随机符号,我们在 y=1y=-1 附近的样本数会比在 y=0.

附近的样本数多