As funcións choice(), sample() e choices() do módulo aleatorio da biblioteca estándar de Python pódense usar para seleccionar e recuperar elementos aleatoriamente dunha lista, tupla, cadea ou outro obxecto de secuencia (mostraxe aleatoria).
choice() obtén un único elemento, sample() e choices() obtén unha lista de varios elementos. sample() é extracción non recuperable sen duplicados, choices() é extracción recuperable con duplicados.
A seguinte información ofrécese aquí.
- Selecciona un elemento ao azar.:
random.choice()
- Selecciona aleatoriamente varios elementos (sen duplicados):
random.sample()
- Selecciona aleatoriamente varios elementos (con duplicados):
random.choices()
- Corrixe a semente do número aleatorio
Selecciona un elemento ao azar.:random.choice()
Coa función choose() do módulo aleatorio, selecciónase aleatoriamente un elemento da lista e pódese recuperar.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
O mesmo aplícase ás tuplas e ás cordas. No caso das cadeas, selecciónase un só carácter.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Produciuse un erro se se especifica unha lista, tupla ou cadea baleiras como argumento.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Selecciona aleatoriamente varios elementos (sen duplicados):random.sample()
Coa función sample() do módulo aleatorio, pode obter varios elementos ao azar dunha lista. Non hai duplicación de elementos (extracción non recuperable).
O primeiro argumento é unha lista e o segundo é o número de elementos que se van recuperar. Devólvese a lista.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Se o segundo argumento se establece en 1, tamén se devolve unha lista cun elemento; se se establece en 0, a lista está baleira. Se o segundo argumento é 1, devólvese unha lista cun elemento; se é 0, devólvese unha lista baleira; se o primeiro argumento é máis que o número de elementos da lista, prodúcese un erro.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Se o primeiro argumento é unha tupla ou unha cadea, o que se devolve aínda é unha lista.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Se queres volver a unha tupla ou cadea, usa tupla(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Teña en conta que o valor non se xulga, polo que se a lista ou tupla orixinal contén elementos co mesmo valor, existe a posibilidade de que se seleccione o mesmo valor.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Se queres evitar valores duplicados, podes usar set() para convertelo nun conxunto (tipo de conxunto) e extraer só os elementos únicos, e despois usar sample().
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Selecciona aleatoriamente varios elementos (con duplicados):random.choices()
A función choices() do módulo aleatorio permítelle recuperar varios elementos ao azar dunha lista e, a diferenza de sample(), permite seleccionar elementos duplicados.
choices() é unha función engadida en Python 3.6. Non está dispoñible en versións anteriores.
O argumento k especifica o número de elementos que se van recuperar. Permítese a duplicación, polo que o número de elementos a recuperar pode ser maior que o número de elementos da lista orixinal.
Dado que k é un argumento só de palabra clave, é necesario especificar unha palabra clave, como k=3.
import random
l = [0, 1, 2, 3, 4]
print(random.choices(l, k=3))
# [2, 1, 0]
print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]
O valor predeterminado de k é 1; se se omite, devólvese unha lista con 1 elemento.
print(random.choices(l))
# [1]
Os pesos dos argumentos pódense usar para especificar o peso (probabilidade) de que se seleccione cada elemento e o tipo de elementos da lista pode ser int ou float.
print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]
print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]
O argumento cum_weights tamén se pode especificar como un peso acumulativo. Os cum_weights do seguinte código de exemplo son equivalentes aos primeiros pesos anteriores.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
O valor predeterminado para os argumentos weights e cum_weights é None, o que significa que cada elemento se selecciona coa mesma probabilidade.
Se a lonxitude (número de elementos) dos argumentos pesos ou cum_weights é diferente da lista orixinal, prodúcese un erro.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Tamén é un erro especificar pesos e cum_weights ao mesmo tempo.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights
Especificamos unha lista como primeiro argumento como exemplo no código de mostra ata agora, pero o mesmo aplícase ás tuplas e cadeas.
Corrixe a semente do número aleatorio
Ao dar un número enteiro arbitrario á función seed() do módulo aleatorio, pódese corrixir a semente de números aleatorios e inicializar o xerador de números aleatorios.
Despois da inicialización coa mesma semente, os elementos sempre se seleccionan do mesmo xeito.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3