Puede usar el multinomial distribution (desde numpy) para hacer lo que quiera. P.ej.
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)
Así el elemento en la primera posición subió 20 veces, el elemento en la segunda posición llegó hasta 32 veces, y el elemento en la tercera posición llegó hasta 48 veces, más o menos lo que cabría esperar dadas las pesas.
Si está teniendo dificultades para envolver su cabeza en la distribución multinomial, encontré que documentation realmente útil.
Los comentarios parecen ser engañosa. 'cumsum()' da los valores acumulativos, no los valores booleanos. Para ser claros, esto funciona, pero los comentarios no coinciden con lo que realmente está sucediendo. –
He corregido para corregir, y también puse el docstring en una línea, como se recomienda en [PEP 257] (http://www.python.org/dev/peps/pep-0257/#one-line-docstrings). –