Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在d维球/球体内生成均匀的随机点?_Algorithm_Multidimensional Array_Random_Geometry_Linear Algebra - Fatal编程技术网

Algorithm 如何在d维球/球体内生成均匀的随机点?

Algorithm 如何在d维球/球体内生成均匀的随机点?,algorithm,multidimensional-array,random,geometry,linear-algebra,Algorithm,Multidimensional Array,Random,Geometry,Linear Algebra,我环顾四周,所有在单位球上生成均匀随机点的解决方案都是为二维或三维设计的 在任意尺寸的球内生成均匀随机点的方法是什么?尤其是,不仅仅是在球的表面上 首先,在立方体中生成随机点并抛出范数大于1的点在高维中是不可行的。在高维空间中,单位球的体积与单位立方体的体积之比为0。即使在10维中,单位立方体中也只有约0.25%的随机点位于单位球内。在d维球中生成均匀分布随机点的最佳方法似乎是考虑极坐标(方向而不是位置)下面提供了代码。 在均匀分布的单位球上选择一个随机点 选择一个随机半径,其中半径的可能性对应

我环顾四周,所有在单位球上生成均匀随机点的解决方案都是为二维或三维设计的

在任意尺寸的球内生成均匀随机点的方法是什么?尤其是,不仅仅是在球的表面上


首先,在立方体中生成随机点并抛出范数大于1的点在高维中是不可行的。在高维空间中,单位球的体积与单位立方体的体积之比为0。即使在10维中,单位立方体中也只有约0.25%的随机点位于单位球内。

d
维球中生成均匀分布随机点的最佳方法似乎是考虑极坐标(方向而不是位置)下面提供了代码。

  • 在均匀分布的单位球上选择一个随机点
  • 选择一个随机半径,其中半径的可能性对应于球的表面积,该半径在
    d
    尺寸中
  • 该选择过程将(1)使所有方向的可能性相等,(2)使单位球内球表面上的所有点的可能性相等。这将在球的整个内部生成所需的均匀随机分布

    拾取随机方向(在单位球上) 为了实现(1),我们可以从标准化为单位长度的高斯分布的
    d
    独立绘图中随机生成向量。因为高斯分布有一个概率分布函数(PDF),其指数为
    x^2
    。这意味着联合分布(对于独立随机变量,这是其PDF的乘法)将在指数中具有
    (x_1^2+x_2^2+…+x_d^2)
    。请注意,这类似于d维中球体的定义,意味着来自高斯分布的
    d
    独立样本的联合分布对旋转是不变的(向量在球体上是均匀的)

    这是在2D中生成的200个随机点的样子


    选择一个随机半径(具有适当的概率) 为了实现(2),我们可以通过使用累积分布函数(CDF)的逆函数生成半径,该函数对应于
    d
    维度中具有半径
    r
    的球的表面积。我们知道,这是成比例的
    r^d
    ,这意味着我们可以在
    [0,1]
    范围内使用它作为CDF。现在,通过将范围
    [0,1]
    内的随机数映射到反向
    r^(1/d)
    来生成随机样本

    这是
    x^2
    (二维)的CDF图像,
    [0,1]
    中随机生成的数字将映射到该曲线上相应的x坐标。(例如
    .1
    ➞ <代码>0.317)


    上面的代码 最后,这里是一些Python代码(假设您安装了NumPy),用于计算上述所有内容

    #在“维度”中生成具有统一属性的“num_点”随机点
    #通过“半径”(点的长度)缩放单位球的概率
    #在[0,“半径”]范围内)。
    def随机球(点数、尺寸、半径=1):
    来自numpy import random,linalg
    #首先,通过规范化一条直线的长度来生成随机方向
    #随机法向值向量(这些值均匀分布在球上)。
    随机方向=随机。正常(大小=(尺寸,点数))
    随机方向/=linalg.norm(随机方向,轴=0)
    #第二,生成一个与概率成正比的随机半径
    #具有给定半径的球的表面积。
    随机半径=随机。随机(点数)**(1/维)
    #返回随机(方向和长度)点的列表。
    返回半径*(随机方向*随机半径).T
    
    对于后人来说,下面是用上述代码生成的5000个随机点的视觉效果


    您能指定该代码的语言吗?也可能想弄清楚如何用算法、游戏开发、几何等来标记它,否则可能很难找到这个优雅的解决方案。谢谢,我在那里找到了算法和几何。我只能有5个标签。这里是算法的链接:谢谢链接!然而,这并不是一个完整的解决方案。这会在球上产生点数。我的问题是如何在球上得分。我会在这个问题上加一条说明,以便进一步澄清。(您可以查看下面解决方案中的图1和图3,了解您提供的链接与我要求的链接之间的差异)