import numpy as np
def random_pick(choices, probs):
'''
>>> a = ['Hit', 'Out']
>>> b = [.3, .7]
>>> random_pick(a,b)
'''
cutoffs = np.cumsum(probs)
idx = cutoffs.searchsorted(np.random.uniform(0, cutoffs[-1]))
return choices[idx]
Как это работает:
In [22]: import numpy as np
In [23]: probs = [0.1, 0.2, 0.5, 0.2]
Вычислить совокупную сумму:
In [24]: cutoffs = np.cumsum(probs)
In [25]: cutoffs
Out[25]: array([ 0.1, 0.3, 0.8, 1. ])
Вычислить равномерно распределенное случайное число вполуоткрытый интервал [0, cutoffs[-1])
:
In [26]: np.random.uniform(0, cutoffs[-1])
Out[26]: 0.9723114393023948
Используйте searchsorted , чтобы найти индекс, куда случайное число будет вставлено в cutoffs
:
In [27]: cutoffs.searchsorted(0.9723114393023948)
Out[27]: 3
Вернуть choices[idx]
, где idx
- это индекс.