Del doc de random.shuffle (x [, random]), dice:
El argumento opcional random es una función de 0 argumentos que devuelve un flotante aleatorio en [0.0, 1.0); por defecto, esta es la función random ()
¿Podría alguien explicar qué significa 0-argument function
y dar un ejemplo de random.shuffle()
con el argumento opcional random
? Busqué pero no pude encontrar ningún ejemplo para ese caso. Además, ¿qué quería decir con "esta es la función random()
"? ¿this
se refiere al argumento opcional?
3 respuestas
Significa que puede pasar el nombre de una función que no requiere un argumento.
def foo():
return 0.5
Es tal función.
def bar(limit):
return limit
No lo es, porque requiere un argumento limit
.
Ejemplo de uso:
random.shuffle(itemlist, random=foo)
Si la entrada itemlist
era [1, 2, 3]
ahora será [1, 3, 2]
. He establecido esto experimentalmente, y supongo que exactamente cómo la operación aleatoria utiliza la salida de la función aleatoria podría cambiar entre las versiones de Python.
El valor predeterminado si no especifica nada es la función random()
.
Un posible caso de uso para esto es si desea resultados predecibles, p. para un caso de prueba. Otra es si desea una distribución no uniforme, por ejemplo, una función aleatoria que prefiera valores pequeños sobre valores grandes, o implemente, p. Poisson o distribución normal.
El parámetro aleatorio es la semilla. Luego, si siempre usa la misma semilla, siempre reordena su matriz con la misma lógica. Ver el ejemplo. 5 está en el índice 4 y va a 0. 6 va a 4 (índice anterior de 5) y luego si reutilizamos la misma semilla, 6 va al índice 0 porque 6 está en el índice 4 como 5 en el primer shuffle
Ejemplo:
>>> import random
>>> r = random.random()
>>> r
0.4309619702601998
>>> x = [1, 2, 3, 4, 5, 6]
>>> random.shuffle(x, lambda: r)
>>> x
[5, 1, 4, 2, 6, 3]
>>> random.shuffle(x, lambda: r)
>>> x
[6, 5, 2, 1, 3, 4]
>>> x = [1, 2, 3, 4, 5, 6]
>>> random.shuffle(x, lambda: r)
>>> x
[5, 1, 4, 2, 6, 3]
Una función de argumento 0 tiene una lista de argumentos vacía.
def random_seed(): # Zero arguments here.
return MY_CONFIG.predictble_random_seed # Some imaginary config.
random.shuffle(some_list, random_seed) # Always the same shuffling.
El objetivo de este arreglo es permitir controlar la previsibilidad del barajado. Puede devolver un número realmente aleatorio (del temporizador, /dev/urandom
, etc., como random.random()
) en producción, y un número controlado en un entorno de prueba:
def get_random_generator(environment):
if environment == 'test':
return lambda: 0.5 # A 0-argument callable returning a constant.
else:
return random.random # A function returning a random number.
# ...
# The below is predictable when testing in isolation,
# unpredictable when running in production.
# We suppose that `environment` has values like 'test' and 'prod'.
random.shuffle(entries, get_random_generator(environment))
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.