2016-05-17 8 views
1

Wie kann ich eine Funktion schreiben, die mir den zufälligen Index eines List-Elements gibt, aber basierend auf den Wahrscheinlichkeiten in der Liste?Python-Zufallslisten-Index mit Wahrscheinlichkeit

Die Liste sieht so aus mit 5 Elementen.

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

Gibt es dafür eine einfache und schnelle Lösung? Danke

+1

ich denke, das ist das, was Sie suchen: http://stackoverflow.com/questions/10803135/weighted-choice-short-and-simple – Akavall

+0

kein Duplikat. Die Frage hat einige unterschiedliche Einzelheiten. – Will

Antwort

2

NumPy wird wahrscheinlich schneller sein, wenn Sie es haben, aber wenn nicht, hier ist eine reine Python-Lösung.

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

Das klingt wie ein Job für Numpy's numpy.random.choice() und seine p Parameter:

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. 

Also, wenn es nur eine Liste (wo ein Element sowohl die Wahrscheinlichkeit jedes Element ist, und das Element selbst ausgewählt werden, können Sie es folgendermaßen tun:

from numpy.random import choice 

elementsAndProbabilities = [0.1, 0.2, 0.4, 0.2, 0.1] 

randomElement = choice(elementsAndProbabilities, p=elementsAndProbabilities) 
print randomElement 

Wenn Sie eine Liste von Elementen und eine Liste von Wahrscheinlichkeiten für jedes Element (separat) haben, können Sie es wie folgt tun:

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 

Nun Sie sagen, Sie den Index, nicht das Element wollen, so wir können den Index wie diese:

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 
Verwandte Themen