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

2024-04-25 10:11:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个随机函数,其中100是最稀有的数字,而1是最常见的数字。它应该是一个线性分布,例如返回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)

通过1-10,这确实会返回更多的低数值,但在这之后,因为它是指数函数,所以10-100的数值非常相似

有没有办法创建如下所示的线性分布:Linear distribution of numbers


Tags: 函数代码numberreturndef线性数字random
3条回答

您所描述的是一个triangular distribution,其模式(最常出现的值)等于min。这些是作为random模块或numpy中的连续分布内置的。如果希望整数结果从1到100(包括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()

样本输出: Histogram of triangular values

对于您正在寻找的分布,只需在该范围内生成两个数字并取其最小值。以下是一个例子:

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

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

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   

相关问题 更多 >