随机生成整数,偏好较低的分布

3

我有一个通过某一质量函数排序的列表,我想要从中取出元素,优先选择列表开头的好元素。

目前,我生成随机索引的函数大致如下:

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

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

  1. 生成的随机分布的名称是什么?
  2. Python 中是否有内置函数可以实现该分布?

{btsdaf} - PeterH
{btsdaf} - Mark Dickinson
3个回答

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


{btsdaf} - Mark Dickinson
{btsdaf} - Severin Pappadeux
{btsdaf} - Mark Dickinson
{btsdaf} - Mark Dickinson
@MarkDickinson 是的,非常不幸 - 我曾经也被它坑过。 - Severin Pappadeux

2

您可以通过指数来模拟它,但这就像让方形木棍配圆形孔。正如Mark所说的那样,这是几何分布-离散的,向右偏移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()

输出:

在此输入图片描述


{btsdaf} - Michael

1

random.random() 默认为均匀分布,但是在 random 中还有其他方法也可以使用。针对您的用例,我建议使用 random.expovariate(2) (文档, 维基百科)。这是一个指数分布,会更偏向于较小的值。如果您查阅文档中列出的其他方法,可以找到其他内置分布。

编辑:确保尝试不同的参数值来使用 expovariate。同时请注意它并不能保证返回值小于1,所以您可能需要确保只使用小于1的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接