python 中数字的线性分布(较高的数字很少见,较低的数字很常见)随机加权机会

Linear distribution of numbers in python (higher numbers are rare, low numbers are common) random weighted chance

我想创建一个随机函数,其中 100 是最稀有的数字,而 1 是最常见的。它应该是一个线性分布,所以例如函数 returning 100 是最低的机会,然后 99 是第二低的,然后 98 是第三低的,依此类推。我试过下面这段代码:

def getPercentContent():
    minPercent = 5
    maxPercent = 102 # this will return 101 as highest number
    power = 1.5 # higher number, more concentration to lower numbers
    num = math.floor(minPercent+(maxPercent-minPercent)*random.random()**power)
    return str(num)

这 return 从 1 到 10 的数字要多得多,但在那之后,由于它是指数函数,数字 10-100 的计数非常相似。

有什么方法可以创建如下所示的线性分布:

您只需要 return 您输入的任何数字的倒数,然后通过所有频率的总和对所有值进行归一化以获得百分比:

def frequency(start: int = 0, end: int = 100):
    freq = [1/n for n in range(start, stop)]
    perc = [k/sum(freq) for k in freq]
    return perc   

对于您要查找的分布,只需生成范围内的两个数字并取其最小值即可。这是一个例子:

min(random.randint(minPercent,maxPercent-1),
        random.randint(minPercent,maxPercent-1))

您描述的是 triangular distribution with its mode (most frequently occurring value) equal to the min. These are built-in as a continuous distribution in the random module or (if you want a lot of them fast) in numpy。如果您想要从 1 到 100(含)的整数结果,请使用 min = mode = 0max = 100 生成,请发言,并将结果加 1。

以下代码在我的笔记本电脑上半秒内生成并绘制了一百万个三角形值:

from numpy.random import default_rng
import matplotlib.pyplot as plt

rng = default_rng()
data = rng.triangular(0, 0, 100, size = 1000000).astype(int) + 1

h = plt.hist(data, bins=100, density=True)
plt.show()

示例输出: