È possibile utilizzare l'multinomial distribution (da NumPy) per fare quello che vuoi. Per esempio.
elements = ['one', 'two', 'three']
weights = [0.2, 0.3, 0.5]
import numpy as np
indices = np.random.multinomial(100, weights, 1)
#=> array([[20, 32, 48]]), YMMV
results = [] #A list of the original items, repeated the correct number of times.
for i, count in enumerate(indices[0]):
results.extend([elements[i]]*count)
Così l'elemento in prima posizione si avvicinò 20 volte, l'elemento in seconda posizione si avvicinò 32 volte, e l'elemento in terza posizione si avvicinò 48 volte, più o meno quello che ci si aspetterebbe data i pesi.
Se hai difficoltà a comprendere la distribuzione multinomiale, ho trovato il documentation davvero utile.
I commenti sembrano essere fuorviante. 'cumsum()' fornisce i valori cumulativi, non i valori booleani. Per essere chiari, funziona, ma i commenti non corrispondono a quello che sta realmente accadendo. –
Ho modificato per correggere e anche mettere la docstring su una riga, come raccomandato in [PEP 257] (http://www.python.org/dev/peps/pep-0257/#one-line-docstrings). –