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
但这太慢了!我需要这个快速!
答案 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