random.randint的加权版本

问题描述 投票:0回答:2

我想在ab(都包括在内)之间选择一个随机整数,其统计权重为c

[c是介于ab之间的值。

哪个是将权重因子c应用于random.randint的最有效方法?

我最接近的是this问题,但有很大的不同:

我只有一个统计权重c,而不是ab之间的每个值的统计概率。

示例:

a = 890
b = 3200

c = 2600

print(random.randint(a,b))

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

我真的不关心ab之间的分布,只要c上有权重即可。然而,高斯分布将不胜感激。

请注意:这个问题没有像numpy.random问题中那样[[not不解决this模块。

python random weighted
2个回答
0
投票
您使用

random.choices(range(a,b+1), weights= [....], k=1) # or cum_weights

对于k为1,且总体为range(a,b+1)和所需的权重。

参见:https://docs.python.org/3/library/random.html#random.choices


您将必须计算可能的(人为的)加权,例如:

import random from collections import defaultdict a = 8 b = 32 c = 26 # hacked distribution w = [(i-a)**2 if i <= c else (b-i+a)**2 for i in range(a,b+1)] d=defaultdict(int) for i in range(a,b+1): d[i]=0 # test for 10k numbers for num in random.choices(range(a,b+1), weights = w, k=10000): d[num] += 1 print(w) print(d)

仍然是随机的,一次奔跑让我:

# hacked distribution [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 196, 169, 144, 121, 100, 81, 64] # test for 10k numbers {8: 0, 9: 8, 10: 7, 11: 37, 12: 61, 13: 94, 14: 149, 15: 175, 16: 229, 17: 283, 18: 374, 19: 450, 20: 493, 21: 628, 22: 672, 23: 820, 24: 907, 25: 1038, 26: 1183, 27: 564, 28: 537, 29: 435, 30: 325, 31: 293, 32: 238}


0
投票
[C0之类的声音可能适合您的需求。值triangular distributiona分别是

min和maxb对应于分布的mode(最可能的结果)。c中有一个三角形发生器。它生成浮点数,但是您可以四舍五入然后将结果整数。如果您很挑剔,则相对于最小值和最大值会略有偏差,与其他整数值相比,最小值和最大值只有一半的范围,因此是预期计数的一半。统计人员使用

连续性校正

进行从实数到整数的范围转换调整:从最小值中减去1/2,在最大值中减去1/2。如果您要处理小范围,这很可能是相关的,如下面的小示例所示。numpy.random

© www.soinside.com 2019 - 2024. All rights reserved.