计算地在n球上选择一个随机点

时间:2016-06-26 13:05:13

标签: python random

我需要随机选择长度为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]

唯一的问题是volume of an n-ball随着尺寸的增大而变小,所以使用来自random.random的均匀分布需要非常长的时间,甚至小的n就像17.有更好(更快)的方式获得n球上的随机点?

1 个答案:

答案 0 :(得分:5)

根据Muller, M. E. "A Note on a Method for Generating Points Uniformly on N-Dimensional Spheres",您需要创建一个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]

如@Bakuriu在评论中所述,使用numpy.random可以在使用更大的向量时为您提供性能优势。