2016-06-26 30 views
5

我需要隨機選取長度爲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得到的均勻分佈需要非常長的時間,甚至對於像17這樣的小n也是如此。是否有更好(更快)的方法來獲得n球上的隨機點?

+0

你可以找到算法[這裏](http://stackoverflow.com/a/34402858/4081336)。 –

+0

@LeandroCaniglia那麼,該算法只處理n = 3 –

+0

通過隨機你是否意味着它必須是均勻分佈的?這些事情變得很棘手,所以我不敢打賭,你現在正在做的事情在這個意義上起作用。 – Bakuriu

回答

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可以爲您提供性能上的優勢時使用更大的向量。

+0

尊重分區使用的縮減。 – YBerman

+0

@YBerman在刪除它之後,我只是編輯它,以便發現過早的優化;) –

+2

您可以考慮使用'numpy.random'來處理這些向量。這可能是高效的。 – Bakuriu