在一组不连续范围内生成随机浮点数

时间:2016-12-09 16:23:11

标签: python-2.7 random floating-point

我希望生成随机浮点数来填充虚拟现实世界中的对象,使用浮点数来定义对象的位置。现在很容易统一填充"框#34;使用random.uniform调用的对象。

import random

#generate random floating coordinates
for z in range(1000):
    x = random.uniform(-1,1)
    y = random.uniform(-1,1)
    z = random.uniform(-1,1)
    #shape = vizshape.addSphere() commented out because this is an uncommon module for VR but I wanted to show how floats are being used
    #shape.setPosition([x,y,z])

我想要做的是将参数传递给random.uniform(),指定多个范围以生成浮点数,例如:

x = random.uniform([-1,1],[2,3])

当然这会导致错误,但我正在寻找一种方法来获得多个,大小变化,不连续范围的浮动。我想不做另外检查,看看生成的花车是否在我想要的范围内,然后决定保持或扔掉。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这有点像黑客,但可以很容易地推广到多个不连续的范围:

import random

def getRandoms(n, ranges):
    answer = []
    for _ in xrange(n):
        low,high = random.choice(ranges)
        answer.append(random.uniform(low, high))

    return answer

答案 1 :(得分:1)

这个想法是首先随机查看范围,然后在所选范围内浮动。然而,问题是,为了使其在所有范围内均匀,应考虑它们的长度。否则,从长远来看,较短的范围将获得与较长范围相同数量的样本,这不是一致的行为。

为了解决这个问题,我们可以将所有范围映射到例如区间[0,1],以保持相对长度。方法如下:

  1. 按升序对范围进行排序,然后获取[a1, b1],...,[an, bn]
  2. di = bi - aii - 范围
  3. 的长度
  4. L为所有di
  5. 的总和
  6. a1映射到0,将b1映射到d1/L
  7. 所有i >= 2地图aib_{i-1}bi到该值加di/L的映射。
  8. 对于所有i >= 1,让xi成为ai的映射。
  9. 现在在s中统一采样一个随机数[0,1],然后按以下步骤进行操作

    1. i0成为i的最后一个索引xi <= s
    2. 使用i0 - 映射的反转来得到答案。换句话说,回答

      f = a_ {i0} +(s-xi)* L / di

      此号码f位于i0个区间,并且已随机统一选择。

    3. enter image description here