c - 在单位球体上产生随机位移

标签 c random gsl

给定一个单位 vector n,我需要尽快生成另一个随机单位 vector mmn 的偏差应该是正参数 sigma 的量级,m 的分布在单位球面上应该关于n对称。

我对单位 vector 的表示没有具体要求,因此您可以使用球面角、笛卡尔坐标或任何方便的表示方式。此外,对使用的概率分布没有精确的要求,只要它在 m 偏离 n 超过 sigma 时衰减即可。

我正在使用 gslC。我想出了一个使用笛卡尔坐标的有点复杂的方法。如果它有用,我会在稍后发布,但我希望看到人们的想法。

最佳答案

您可能知道,每个维度均匀分布在 0 附近的 vector 会产生一个点的立方体,其更多值集中在角落。但是每个维度正态分布在 0 附近的 vector 要好得多。点的极角在单位球体上均匀分布,其半径集中在原点附近。您可以像这样生成 vector ,根据您的参数 sigma 更改标准偏差。将 vector 添加到 n,对结果进行归一化,并将其称为好。

这需要一个平方根和 3 个正态分布的随机数。您可以使用 Ziggurat algorithm 快速获得正态分布的随机数.一个更近似的选择是对 3 个或更多均匀分布的随机数求和。还有另一种可能性:预先计算一个包含许多随机 vector 的表,并使用随机索引进行表查找。这些方法中的每一种都以不同的方式平衡计算和存储,因此您应该对它们全部进行编码并测试速度。

关于c - 在单位球体上产生随机位移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12359838/

相关文章:

python - 如何正确检查列表项并记录是否已检查?

haskell - 使用 hmatrix-gsl-stats 对随机分布进行采样时如何推进 RNG 状态?

c++ - 在 CMakeLists.txt 中链接 GSL

c++ - lambda函数与gsl的数值积分

c - 限制C中一个文件内全局变量的范围

python - 播种 Python RNG 显示集合的非确定性行为

c - Borland C/C++ 将 short 转换为 unsigned int

c++ - 从多个线程使用 stdlib 的 rand()

c - 如何在 json_tokener_parse() 之后获取 json 值?

在 C 中创建线程安全的全局存储