Как использовать необязательный аргумент random.shuffle в Python - PullRequest
1 голос
/ 01 октября 2019

В doc файла random.shuffle (x [, random]) написано:

Необязательный аргумент random - это функция с 0 аргументами, возвращающая случайное число с плавающей точкой. в [0,0, 1,0);по умолчанию это функция random ()

Может кто-нибудь объяснить, что означает 0-argument function, и привести пример random.shuffle() с необязательным аргументом random? Я искал, но не смог найти ни одного примера для этого случая. Кроме того, что означает «это функция random()»? this ссылается на необязательный аргумент?

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Функция с 0 аргументами имеет пустой список аргументов.

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.

Смысл этой схемы состоит в том, чтобы позволить контролировать предсказуемость тасования. Вы можете вернуть действительно случайное число (из таймера, /dev/urandom и т. Д., Как это делает random.random()) в производстве и контролируемое число в тестовой среде:

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 голосов
/ 01 октября 2019

Это означает, что вы можете передать имя функции, которая не требует аргумента.

def foo():
    return 0.5

- это такая функция.

def bar(limit):
    return limit

- нет, потому что она требуетаргумент limit.

Пример использования:

random.shuffle(itemlist, random=foo)

Если вход itemlist был [1, 2, 3], теперь он будет [1, 3, 2]. Я установил это экспериментально, и я предполагаю, как точно операция shuffle, использующая вывод случайной функции, может измениться между версиями Python.

По умолчанию, если вы ничего не указали, это функция random().

Один из возможных вариантов использования этого - если вы хотите получить предсказуемый вывод, например, для тестового примера. Другой вариант - если вам нужно неравномерное распределение - например, случайная функция, которая предпочитает маленькие значения большим, или реализует, например, пуассоновское или нормальное распределение.

0 голосов
/ 01 октября 2019

Случайный параметр - это начальное число. Затем, если вы всегда используете одно и то же начальное число, он всегда переупорядочивает ваш массив с той же логикой. Смотрите пример. 5 - индекс 4 и переход к 0. 6 переход к 4 (старый индекс 5), затем, если мы повторно используем то же начальное число, 6 - индекс 0, потому что 6 - индекс 4, как 5 при первом перемешивании
Пример:

>>> 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]

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...