Это звучит как работа для Numpy's numpy.random.choice()
и его p
параметр:
p : 1-D array-like, optional
The probabilities associated with each entry in a. If not given,
the sample assumes a uniform distribtion over all entries in a.
Так что, если есть только один список (где элемент и вероятность каждого элемента, и сам элемент должен быть выбран, вы можете сделать это следующим образом:
from numpy.random import choice
elementsAndProbabilities = [0.1, 0.2, 0.4, 0.2, 0.1]
randomElement = choice(elementsAndProbabilities, p=elementsAndProbabilities)
print randomElement
Если у вас есть список элементов и список вероятностей для каждого элемента (отдельно), вы можете сделать это следующим образом:
from numpy.random import choice
elements = ["first", "second", "third", "fourth", "fifth"]
probabilities = [0.1, 0.2, 0.4, 0.2, 0.1]
randomElement = choice(elements, p=probabilities)
print randomElement
Теперь, вы сказали, что вы хотели индекса, а не элемент, так мы можем получить индекс, как это:
from numpy.random import choice
probabilities = [0.1, 0.2, 0.4, 0.2, 0.1]
randomElement = choice(range(len(probabilities)), p=probabilities)
print randomElement
Я думаю, что это то, что вы ищете: http://stackoverflow.com/questions/10803135/weighted-choice-short-and-simple – Akavall
не дублируется. Вопрос имеет несколько разных особенностей. – Will