我需要随机选择一个长度为1的n维向量.我最好的想法是在球体中选择一个随机点并将其标准化:
import random
def point(n):
sq = 0
v = []
while len(v) < n:
x = 1 - 2*random.random()
v.append(x)
sq = sq + x*x
if sq > 1:
sq = 0
v = []
l = sq**(0.5)
return [x / l for x in v]
Run Code Online (Sandbox Code Playgroud)
唯一的问题是随着尺寸的增加,n球的 体积会变小,所以使用均匀分布random.random需要非常长的时间,即使很小的n也是如此.是否有更好(更快)的方法来获得随机点n维球面?
根据Muller,ME"关于在N维球体上均匀生成点的方法的注释",您需要创建一个n个高斯随机变量的向量并除以其长度:
import random
import math
def randnsphere(n):
v = [random.gauss(0, 1) for i in range(0, n)]
inv_len = 1.0 / math.sqrt(sum(coord * coord for coord in v))
return [coord * inv_len for coord in v]
Run Code Online (Sandbox Code Playgroud)
正如@Bakuriu在评论中所说,使用numpy.random可以在使用更大的向量时为您提供性能优势.