给定一个单位 vector n,我需要尽快生成另一个随机单位 vector m。 m 与 n 的偏差应该是正参数 sigma
的量级,m 的分布在单位球面上应该关于n对称。
我对单位 vector 的表示没有具体要求,因此您可以使用球面角、笛卡尔坐标或任何方便的表示方式。此外,对使用的概率分布没有精确的要求,只要它在 m 偏离 n 超过 sigma
时衰减即可。
我正在使用 gsl
和 C
。我想出了一个使用笛卡尔坐标的有点复杂的方法。如果它有用,我会在稍后发布,但我希望看到人们的想法。
最佳答案
您可能知道,每个维度均匀分布在 0
附近的 vector 会产生一个点的立方体,其更多值集中在角落。但是每个维度正态分布在 0
附近的 vector 要好得多。点的极角在单位球体上均匀分布,其半径集中在原点附近。您可以像这样生成 vector ,根据您的参数 sigma
更改标准偏差。将 vector 添加到 n
,对结果进行归一化,并将其称为好。
这需要一个平方根和 3 个正态分布的随机数。您可以使用 Ziggurat algorithm 快速获得正态分布的随机数.一个更近似的选择是对 3 个或更多均匀分布的随机数求和。还有另一种可能性:预先计算一个包含许多随机 vector 的表,并使用随机索引进行表查找。这些方法中的每一种都以不同的方式平衡计算和存储,因此您应该对它们全部进行编码并测试速度。
关于c - 在单位球体上产生随机位移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12359838/