2016-05-17 3 views
1

Как написать функцию, которая дает мне случайный индекс элемента списка, но на основе вероятностей в списке?Python random list-index с вероятностью

Этот список выглядит как 5 элементов.

a = [0.1, 0.2, 0.4, 0.2, 0.1] 

Есть ли простое и быстрое решение для этого? Спасибо

+1

Я думаю, что это то, что вы ищете: http://stackoverflow.com/questions/10803135/weighted-choice-short-and-simple – Akavall

+0

не дублируется. Вопрос имеет несколько разных особенностей. – Will

ответ

2

NumPy, вероятно, будет быстрее, если он у вас есть, но если нет, то это чистое решение Python.

from random import random 

a = [0.1, 0.2, 0.4, 0.2, 0.1] 

def randombin(bins): 
    r = random() 
    p = 0 
    for i, v in enumerate(bins): 
     p += v 
     if r < p: 
      return i 
    # p may not equal exactly 1.0 due to floating-point rounding errors 
    # so if we get here, just try again (the errors are small, so this 
    # should not happen very often). You could also just put it in the 
    # last bin or pick a bin at random, depending on your tolerance for 
    # small biases 
    return randombin(bins) 

print randombin(a) 
3

Это звучит как работа для 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 
Смежные вопросы