python - 生成总和等于 0 的 N 个随机单位向量(Python)

标签 python vector random

我想在单位球体上(均匀地)生成 N 个随机 3 维向量,但条件是它们的和等于 0。我的尝试是生成 N/2 个随机单位向量,而另一个只是带有减号的相同向量。问题是,因为我试图实现尽可能少的相关性,而我的想法显然并不理想,因为我的一半向量与其对应的对完全反相关。

最佳答案

您的问题并没有真正的解决方案,但您可以生成一组向量,这些向量的相关性将比您最初的否定解决方案明显不那么明显。准确地说,如果你生成N/2个向量并对它们取反,然后将取反的向量围绕它们的和旋转任意角度,你可以保证和为零,相关性更大比负单位矩阵更复杂的旋转。

import numpy as np
from scipy.spatial.transform import Rotation

N = 10

v1 = np.random.normal(size=(N / 2, 3))
v1 /= np.linalg.norm(v1, axis=1, keepdims=True)

axis = v1.sum(0)
rot = Rotation.from_rotvec(np.random.uniform(2.0 * np.pi) * axis / np.linalg.norm(axis))

v2 = rot.apply(-v1)

result = np.concatenate((v1, v2), axis=0)

这假设 N 在所有情况下都是偶数。正态分布是在球体上均匀生成点的一种相当标准的方法:https://mathworld.wolfram.com/SpherePointPicking.html .

如果总和正好为零有一些回旋余地,您可以对齐两组随机的 N/2 向量,使它们的总和指向彼此相反的方向。

关于python - 生成总和等于 0 的 N 个随机单位向量(Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67067350/

相关文章:

java - 随机生成的 UUID 有重复项

python - 使 View 代码显示模块源

类中的python生成器

python - 关于 python 日期时间类型

c++ Vector在类中声明为私有(private)但具有get函数

c++ - 在 vector 中的派生类上调用重载的 << 运算符

python - 如何增加文件python中的最后一个数字

c++ - 使用迭代器作为 vector 中的位置

0 和 1 的 Python 随机数组

matlab - 生成随机点 - 限制总面积中每 block 瓷砖的数量