usar - iteración aleatoria en Python
random letras python (5)
Demostración de los generadores de Python y el shuffle de Fisher-Yates .
import random
def shuffled(sequence):
deck = list(sequence)
while len(deck):
i = random.randint(0, len(deck) - 1) # choose random card
card = deck[i] # take the card
deck[i] = deck[-1] # put top card in its place
deck.pop() # remove top card
yield card
Solo generas tantos números aleatorios como uses. Pero, honestamente, es probable que no random.shuffle
mucho, por lo que normalmente debería usar random.shuffle
.
Nota: Si se elige la carta superior, deck[i] = deck.pop()
no sería seguro, por lo que quitar la tapa se realiza en dos pasos.
Cuando quieras iterar secuencialmente sobre una lista de números, escribirás:
for i in range(1000):
# do something with i
¿Pero qué sucede si desea iterar sobre la lista de números del rango (0..999) al azar? Hay una necesidad (en cada iteración) de elegir aleatoriamente el número que no se eligió en cualquier iteración anterior y hay una necesidad de iterar sobre todos los números del rango (0..999).
¿Sabes cómo hacer eso (inteligente)?
Hay una función random.permutation()
en numpy
que hace exactamente eso por ti. Tu código se vería como
from numpy.random import permutation
for i in permutation(1000):
# do something with i
Las personas a menudo pierden oportunidades de modularización. Puede definir una función para encapsular la idea de "iterar aleatoriamente":
def randomly(seq):
shuffled = list(seq)
random.shuffle(shuffled)
return iter(shuffled)
entonces:
for i in randomly(range(1000)):
#.. we''re good to go ..
Puede usar random.shuffle()
para, bueno, barajar una lista:
import random
r = list(range(1000))
random.shuffle(r)
for i in r:
# do something with i
Por cierto, en muchos casos en los que usarías un bucle for
sobre un rango de enteros en otros lenguajes de programación, puedes describir directamente la "cosa" que quieres iterar en Python.
Por ejemplo, si desea utilizar los valores de i
para acceder a los elementos de una lista, debería barajar la lista directamente:
lst = [1970, 1991, 2012]
random.shuffle(lst)
for x in lst:
print x
NOTA: Debe tener en cuenta la siguiente advertencia cuando use random.shuffle()
(tomado de la random.shuffle() :
Tenga en cuenta que incluso para len (x) bastante pequeño, el número total de permutaciones de x es mayor que el período de la mayoría de los generadores de números aleatorios; esto implica que la mayoría de las permutaciones de una secuencia larga nunca se pueden generar.
Utilice el método random.shuffle:
itrange = list(range(100))
random.shuffle(itrange)
for i in itrange:
print i