是一个带有概率的数字范围



一种从概率范围中获取数字的方法

假设在1 - 5[.50, .30, .10, .07, .03]之间的数字范围有50%%的返回概率这很容易,但它只适用于小数字(random.choices([1, 2, 3, 4,5], [.50, .30, .10, .07, .03])),这次我们假设范围在1 - 100之间,1 - 40范围内的数字只返回20%,以此类推。

1 - 100个数范围的概率

1 - 40   10%
41 - 60  35%
61 - 70  25%
71 - 80  15%
81 - 90  10%
91 - 95   4%
96 - 100  1%
import random
thing = [(10, 40), (41, 60), (61, 70), (71, 80), (81, 90), (91, 95), (96, 100)]
prob = [.10, .35, .25, .15, .10, .04, .01]

[(start, stop)] = random.choices(thing, prob)
num = random.randrange(start, stop + 1, 1)
print(num)

我正要问这个问题,但意识到这其实很简单

使用random.choices和权重选择一个范围,然后使用random.choice从该范围中选择一个随机数。我将choices调用设置为zipped的一系列元组,以便将范围与概率关联起来:

>>> random.choice(random.choices(*zip(
...     (range(1, 41), 10),
...     (range(41, 61), 35),
...     (range(61, 71), 25),
...     (range(71, 81), 15),
...     (range(81, 91), 10),
...     (range(91, 96), 4),
...     (range(96, 101), 1),
... ))[0])
65

最新更新