Estoy trabajando en una parte de IA de un juego de adivinanzas. Quiero que la IA seleccione una letra aleatoria de esta lista. Lo hago como un conjunto para poder eliminar fácilmente las letras de la lista, ya que se adivinan en el juego y, por lo tanto, ya no están disponibles para adivinarlas nuevamente.
dice que el set
objeto no es indexable. ¿Cómo puedo solucionar esto?
import random
aiTurn=True
while aiTurn == True:
allLetters = set(list('abcdefghijklmnopqrstuvwxyz'))
aiGuess=random.choice(allLetters)
print (aiGuess)
Respuestas:
>>> random.sample(set('abcdefghijklmnopqrstuvwxyz'), 1) ['f']
Documentación: https://docs.python.org/3/library/random.html#random.sample
fuente
[0]
al final para que sea básicamente idéntico arandom.choice
(que no devuelve sus valores en forma de lista)random.sample
lo hacetuple(population)
internamente, por lo querandom.choice(tuple(allLetters))
puede ser mejor.random.choice
. Si el conjunto también cambia mientras lo muestrea, probablemente no debería utilizar ningún conjunto. Si supiera los hashes ocupados en el conjunto y los tamaños de cubeta, sería fácil escribir una función de muestreo ...Debería usarlo
random.choice(tuple(myset))
, porque es más rápido y posiblemente más limpio querandom.sample
. Escribí lo siguiente para probar:import random import timeit bigset = set(random.uniform(0,10000) for x in range(10000)) def choose(): random.choice(tuple(bigset)) def sample(): random.sample(bigset,1)[0] print("random.choice:", timeit.timeit(choose, setup="global bigset", number=10000)) # 1.1082136780023575 print("random.sample:", timeit.timeit(sample, setup="global bigset", number=10000)) # 1.1889629259821959
Según los números, parece que
random.sample
tarda un 7% más.fuente
random.sample
pasa de ser más lentorandom.choice
a ser más rápido a medida que aumenta el tamaño del conjunto (el punto de cruce está en algún lugar entre el tamaño del conjunto 100k-500k). Es decir, cuanto mayor sea el conjunto, es más probable querandom.sample
sea más rápido.