【问题标题】:Create random uniform vector [duplicate]创建随机均匀向量
【发布时间】:2019-08-21 10:50:17
【问题描述】:

给定 gunction float frand(),生成均匀分布的随机浮点值,范围为 [0.0, 1.0)

如何创建均匀分布的随机 3D 单位向量和 4D 单位四元数? (因此 3D 矢量位于单位球面上,4D - 在单位超球面上,矢量均匀分布在对应的表面之间)

【问题讨论】:

    标签: vector random quaternions uniform-distribution


    【解决方案1】:

    您应该使用 frand() 函数从高斯分布(均值 = 0,偏差 = 1)中选择向量的分量,然后对其进行归一化。

    另一种更简单的方法是生成随机向量 (x, y, z...) 作为x = frand(); y = frand(); ... 并丢弃它(生成新的),如果它比 1 长。然后规范化这个向量。这将消除扭曲分布的情况。但是我觉得这种方法很难看,因为它是拉斯维加斯算法的不必要示例,可能不会终止。

    查看类似问题的答案:random unit vector in multi-dimensional space

    【讨论】:

    • 高斯分布在 (0,0,0) 处有最大值,所以我们很可能会得到零长度向量.. 归一化它?我在这里不明白......按秒计算,是的,它的变量proposed by G.Marsaglia
    • @xakepp35 我不确定高斯分布在 (0, 0, 0) 处的最大值是什么意思。我不是在谈论多元高斯分布,即使那样似乎也存在误解。对于每个组件(例如 (x, y, z) 中的 x、y 和 z),您将独立地从正态分布生成随机数。例如,您的函数 frand() 可用于 Box-Muller 转换以生成此类数字。然后你应该通过将每个分量除以向量的长度来归一化向量,这会将任何向量转换为单位向量。
    • 按高斯(正态)分布我的意思是wiki definition - 如果您查看概率图,您会发现我们最有可能最终得到 (0,0,0) 向量...归一化是什么意思,高斯正态分布与在球体表面(不是在球体内部,而是在其表面!)上获取点有何关系?
    • @xakepp35 确实有可能(但不太可能)得到 0 长度的向量,这应该被考虑在内。大多数情况下,您最终会得到一些“在单位球体内”的向量,该向量具有随机方向,但大小也随机。要规范化向量(将向量调整为单位大小而不改变其方向的行为),您必须将其分量除以向量的长度(通过毕达哥拉斯公式获得)。 mathworld.wolfram.com/HyperspherePointPicking.html 中的最后一个表达式。还要检查en.wikipedia.org/wiki/Unit_vector 关于规范化。
    • 为了解释高斯分布和超球面上的点之间的关系,请检查重复问题上的 cmets。在分析时还要记住,由于标准化,我们并不关心向量的大小(或者您似乎认为的点与原点的距离)。
    猜你喜欢
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2020-04-04
    • 2018-10-24
    • 2021-12-28
    相关资源
    最近更新 更多