python - random.randint 的加权版本

标签 python random weighted

我想在 a 之间选择一个随机整数和b (两者均包含),统计权重为c .

ca 之间的值和b .

应用权重因子最有效的方法是 c到 random.randint?

我得到的最接近的是this问题,但有很大的区别:

我只有一个统计权重 c ,不是 a 之间每个值的统计概率和b .

示例:

a = 890
b = 3200

c = 2600

print(random.randint(a,b))

>>>> supposed to result most frequently in a value around 2600

我不太关心 a 之间的分布和b ,只要c上有一个权重。然而,高斯分布将受到赞赏。

请注意:此问题不解决 numpy.random模块如this问题。

最佳答案

听起来像 triangular distribution可能适合您的需求。值ab分别是minmaxc对应于分布的模式(最可能的结果)。

numpy.random中有一个三角形生成器。它生成 float ,但您可以对结果进行舍入然后整数化。如果您很挑剔,这会稍微偏离最小值和最大值,与其他整数值相比,它们只有范围的一半,因此预期计数的一半。统计学家使用连续性校正来调整从实数到整数的范围转换:从最小值中减去 1/2,在最大值中加上 1/2。如果您处理的是小范围,这很可能是相关的,如下面的小示例所示。

import numpy as np
import matplotlib.pyplot as plt

# replace with your actual values
a = 1
b = 5
c = 2

# Without continuity correction
plt.hist(np.ma.round(np.random.triangular(
          left = a,
          mode = c,
          right = b, 
          size = 100000)
        ).astype(int),
        range = (0.5, 5.5), bins = 50, density = True)
plt.show()

# With continuity correction
plt.hist(np.ma.round(np.random.triangular(
          left = a - 0.5,
          mode = c,
          right = b + 0.5, 
          size = 100000)
        ).astype(int),
        range = (0.5, 5.5), bins = 50, density = True)
plt.show()

以下是实际参数化的结果:

# Actual target case
a = 890
b = 3200
c = 2600
plt.hist(np.ma.round(np.random.triangular(
          left = a - 0.5,
          mode = c,
          right = b + 0.5, 
          size = 100000)
        ).astype(int),
        range = (500, 3500), bins = 300, density = True)
plt.show()

Histogram of generated triangular distribution

请注意,与注释中建议的正态分布不同,这保证保持在 (a, b) 范围内。

关于python - random.randint 的加权版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60870070/

相关文章:

java - 在java中随机选择的对象上调用通用方法的更好方法

C: srand 不影响随机数生成器

python - 根据 NetworkX 中出现的次数计算边的权重

python - wxPython:如何使任务栏图标响应左键单击

java - 获取字符串中非唯一单词的边界索引

java - 猜测随机数,当随机数与猜测值相同时停止

sql - 加权关键字搜索

r - 在 igraph 中创建加权边而不是多个单一连接

python - 如何在 heroku 上使用 python 中的 boto3 将文件上传到 s3?

python:执行字典中的内容(命令)