我有一个按一些质量函数排序的列表,我想从中获取元素,更喜欢列表开头的好元素。
目前,我生成随机索引的功能基本上如下:
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;
}
}
}
它做得很好,但我想知道:
答案 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()
答案 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()
输出:
答案 2 :(得分:1)
random.random()
默认为统一分布,但random
中的其他方法也可以使用。对于您的特定用例,我建议random.expovariate(2)
(Documentation,Wikipedia)。这是一个指数分布,更倾向于较低的值。如果你谷歌文档中列出的一些其他方法,你可以找到一些其他内置的发行版。
编辑:务必使用expovariate
的参数值。另请注意,它不能保证小于1的值,因此您可能需要确保仅使用小于1的值。