Python中间隔联合中的随机数

时间:2014-01-29 23:04:42

标签: python random range union

1)如何在Python的间隔联合中生成随机数?

我知道随机包的存在,我知道如何使用这个函数。

2)如何在一组非重叠圆的并集之外找到一个圆(x,y,半径),并给出一个包含这个圆的半径的矢量,并按降序排列?< / p>

这是我到目前为止所做的:

import random as rand
import numpy as np
from numpy import *

r = #some irrelevant function or defined vector

[x,y]=[array([],dtype=float) for dummy in range(2)]

for j in xrange(0,len(r)):
    x=np.append(x,rand.uniform(0,1))
    y=np.append(y,rand.uniform(0,1))
    q=-1;
    while (q<j-1):
        q=q+1
        if ((x[j]-x[q])**2+(y[j]-y[q])**2<=(r[j]+r[q])**2):
            x[j]=(rand.uniform(0,1))
            y[j]=(rand.uniform(0,1))
            q=-1 

但这太慢了!我需要这个快速!

2 个答案:

答案 0 :(得分:0)

生成介于0和间隔总和之间的随机数,二进制搜索(累积和,间隔)对的列表。所以使用区间[0,1),[2,5],[8,10]我有一个列表:

[(1, [0, 1)), (4, [2, 5)), (6, [8, 10))]

6是所覆盖总空间的总和,因此在[0,6]中生成一个随机数。如果数字是3.5,则在我们的列表中二进制搜索3.5。它立即落在它所属的区间的左侧。

[(1, [0, 1)), <3.5>, (4, [2, 5)), (6, [8, 10))]

对于圈子,您能描述圈子必须从哪个分布中抽取?否则只是生成一个随机圆圈,它与你所拥有的圆圈重叠的几率非常小。如果你有一个分布,但总空间中的圈子很少,那么这可能是一个碰撞检测问题。查找四叉树。

答案 1 :(得分:0)

如果你可以轻松计算你的间隔联合的总大小,那么从联盟中挑选一个随机值并不困难。这里有一些不是非常优化的代码:

def random_from_intervals(intervals): # intervals is a sequence of start,end tuples
    total_size = sum(end-start for start,end in intevals)
    n = random.uniform(total_size)
    for start, end in intervals:
        if n < end-start:
            return start + n
        n -= end-start

你可以做一些相当于在一组圆圈的联合内选择一个点的东西。只需按每个圆的面积(或半径平方,因为单位无关紧要)进行称重。一旦你将某些东西缩小到一个特定的圆圈,就选择一个特定的点有点困难,但不是不可解决的。这里有一些代码,我作弊一点,生成一个额外的随机数,以帮助从中心给定半径的点中选择:

def random_from_circles(circles): # circles is a sequence of x,y,r tuples
    total_weight = sum(r**2 for x,y,r in circles)
    n = random.uniform(total_weight)
    for x, y, r in circles:
        if n < r**2:
            d = n**0.5
            theta = random.uniform(math.pi*2)
            return x + d * math.cos(theta), y + d * math.sin(theta)
        n -= r**2