随机生成具有偏好低的分布的整数

时间:2017-10-24 17:39:31

标签: python random

我有一个按一些质量函数排序的列表,我想从中获取元素,更喜欢列表开头的好元素。

目前,我生成随机索引的功能基本上如下:

outer:
for (var i = 0; i < 10; i++) {
   inner:
   for (var j = 0; j < 10; j++) {
      console.log(i, j)
      if (j == 2) {
         break outer;
      }
   }
}

它做得很好,但我想知道:

  1. 生成的随机分布的名称是什么?
  2. Python中是否有用于该发行版的内置函数?

3 个答案:

答案 0 :(得分:3)

你所描述的内容听起来很像指数分布。它已存在于random模块中。

以下是一些代码,它只采用速率参数为100的指数分布的整数采样部分。

import random
import matplotlib.pyplot as plt

d = [int(random.expovariate(1/100)) for i in range(10000)]
h,b = np.histogram(d, bins=np.arange(0,max(d)))

plt.bar(left=b[:-1], height=h, ec='none', width=1))
plt.show()

enter image description here

答案 1 :(得分:2)

你可以通过指数来模拟它,但这就像制作方形钉适合圆孔一样。正如马克所说,它是几何分布 - 离散,偏移1.它正好在numpy中:

import numpy as np
import random
import itertools
import matplotlib.pyplot as plt

p = 0.2

def pick():
    for i in itertools.count():
        if random.random() < p:
            break
    return i

q = np.random.geometric(p, size = 100000) - 1
z = [pick() for i in range(100000)]

bins = np.linspace(-0.5, 30.5, 32)

plt.hist(q, bins, alpha=0.2, label='geom')
plt.hist(z, bins, alpha=0.2, label='pick')
plt.legend(loc='upper right')

plt.show()

输出:

enter image description here

答案 2 :(得分:1)

random.random()默认为统一分布,但random中的其他方法也可以使用。对于您的特定用例,我建议random.expovariate(2)DocumentationWikipedia)。这是一个指数分布,更倾向于较低的值。如果你谷歌文档中列出的一些其他方法,你可以找到一些其他内置的发行版。

编辑:务必使用expovariate的参数值。另请注意,它不能保证小于1的值,因此您可能需要确保仅使用小于1的值。