21
球体上的随机点
挑战 编写一个程序或函数,该程序或函数不输入任何内容,并在理论上均匀的随机方向上输出长度为的向量。111 这等效于所描述的球面上的随机点x2+y2+z2=1x2+y2+z2=1x^2+y^2+z^2=1 导致这样的分布 输出量 从理论上均匀的随机分布中得出三个浮点数,方程满足精度极限。x2+y2+z2=1x2+y2+z2=1x^2+y^2+z^2=1 挑战备注 理论上,随机分布必须是均匀的。也就是说,如果将伪随机数生成器替换为实数中的真实RNG ,则会导致球体上点的均匀随机分布。 从均匀分布中生成三个随机数并将它们归一化是无效的:将会对三维空间的各个角产生偏差。 同样,从均匀分布中生成两个随机数并将其用作球面坐标也是无效的:向球体的极点会产生偏差。 适当的均匀性可以通过算法实现,这些算法包括但不限于: 根据附近的正态(高斯)分布生成三个随机数,和并将其标准化。 xxxyyyzzz000 实施实例 根据范围内的均匀分布生成三个随机数,和xxxyyyzzz(−1,1)(−1,1)(-1,1)。通过l = √计算向量的长度l=x2+y2+z2−−−−−−−−−−√l=x2+y2+z2l=\sqrt{x^2+y^2+z^2}。然后,如果l>1l>1l>1,则拒绝该向量并生成一组新的数字。否则,如果l≤1l≤1l \leq 1,标准化载体并返回结果。 实施实例 生成两个随机数iii和jjj从均匀的范围内分布(0,1)(0,1)(0,1)并将其转换为球面坐标,像这样:θϕ=2×π×i=cos−1(2×j−1)θ=2×π×iϕ=cos−1(2×j−1)\begin{align}\theta &= 2 \times \pi \times i\\\\\phi &= \cos^{-1}(2\times j -1)\end{align}因此可以通过 x计算xxx,yyy和zzzxyz=cos(θ)×sin(ϕ)=sin(θ)×sin(ϕ)=cos(ϕ)x=cos(θ)×sin(ϕ)y=sin(θ)×sin(ϕ)z=cos(ϕ)\begin{align}x &= \cos(\theta) \times \sin(\phi)\\\\y &= \sin(\theta) \times \sin(\phi)\\\\z &= \cos(\phi)\end{align} 实施实例 在您的答案中提供您正在使用的算法的简短描述。 在MathWorld上阅读有关球体点拾取的更多信息。 输出示例 [ 0.72422852 -0.58643067 …