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?

1
Nemo 1 oct. 2019 a las 17:03

3 respuestas

La mejor respuesta

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.

2
tripleee 1 oct. 2019 a las 15:21

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]

Fuente

-1
Timothée Dautrême 1 oct. 2019 a las 14:29

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))  
2
9000 1 oct. 2019 a las 16:01
58186496