Предположим, у меня есть следующий список:
foo = ['a', 'b', 'c', 'd', 'e']
Какой самый простой способ получить элемент в случайном порядке из этого списка?
использование random.choice()
import random
foo = ['a', 'b', 'c', 'd', 'e']
print(random.choice(foo))
Для криптографически безопасного случайного выбора (например, для генерации ключевой фразы из списка слов) используйтеsecrets.choice()
import secrets
foo = ['battery', 'correct', 'horse', 'staple']
print(secrets.choice(foo))
secrets
впервые в Python 3.6, в более старых версиях Python вы можете использовать random.SystemRandom
класс:
import random
secure_random = random.SystemRandom()
print(secure_random.choice(foo))
random.choice(foo)
возврата два разных результата?random.sample(lst, n)
Standard pseudo-random generators are not suitable for security/cryptographic purposes.
ссылкаЕсли вы хотите случайным образом выбрать более одного элемента из списка или выбрать элемент из набора, я бы рекомендовал использовать
random.sample
вместо этого.Однако, если вы извлекаете только один элемент из списка, выбор будет менее неуклюжим, поскольку использование примера будет иметь синтаксис
random.sample(some_list, 1)[0]
вместоrandom.choice(some_list)
.К сожалению, выбор работает только для одного вывода из последовательностей (таких как списки или кортежи). Хотя
random.choice(tuple(some_set))
может быть вариант для получения одного элемента из набора.РЕДАКТИРОВАТЬ: Использование секретов
Как уже отмечали многие, если вам нужны более безопасные псевдослучайные образцы, вы должны использовать модуль секретов:
РЕДАКТИРОВАТЬ: Pythonic One-Liner
Если вы хотите более питонную однострочность для выбора нескольких элементов, вы можете использовать распаковку.
источник
secrets
модуль был добавлен в стандартную библиотеку Python в версии 3.6 python.org/dev/peps/pep-0506Если вам также нужен индекс, используйте
random.randrange
источник
Начиная с Python 3.6 вы можете использовать
secrets
модуль, который предпочтительнееrandom
модуля для криптографии или безопасности.Чтобы распечатать случайный элемент из списка:
Чтобы напечатать случайный индекс:
Подробнее см. PEP 506 .
источник
Я предлагаю скрипт для удаления случайно выбранных элементов из списка, пока он не станет пустым:
Сохраните
set
и удалите случайно выбранный элемент (сchoice
), пока список не станет пустым.Три прогона дают три разных ответа:
источник
random.shuffle
list
В питоне 2:
В питоне 3:
источник
random.choices
с заменой покаrandom.sample
без замены.numpy
решение:numpy.random.choice
Для этого вопроса он работает так же, как принятый ответ (
import random; random.choice()
), но я добавил его, потому что программист, возможно, уже импортировалnumpy
(как я), а также есть некоторые различия между этими двумя методами, которые могут касаться вашего фактического варианта использования.Для воспроизводимости вы можете сделать:
Для образцов одного или нескольких элементов , возвращаемых как
array
, передайтеsize
аргумент:источник
Если вы хотите, чтобы значение было действительно случайным , то я предлагаю
secrets.choice
из стандартной библиотеки (Новое в Python 3.6.):Вышесказанное эквивалентно моей предыдущей рекомендации, использующей
SystemRandom
объект изrandom
модуля сchoice
методом, доступным ранее в Python 2:И сейчас:
Если вы хотите детерминированный псевдослучайный выбор, используйте
choice
функцию (которая на самом деле является связанным методом дляRandom
объекта):Это кажется случайным, но на самом деле это не так, что мы можем увидеть, если повторить его повторно:
Комментарий:
Да, вы можете передать ему аргумент "seed", но вы увидите, что
SystemRandom
объект просто игнорирует его :источник
если вам нужен индекс, просто используйте:
random.choice делает то же самое :)
источник
random.choice(self, seq)
естьreturn seq[int(self.random() * len(seq))]
.randrange()
что означает, например,random.SystemRandom().randrange(3<<51)
демонстрирует значительный уклон. Вздох ...float
(двойное значение IEEE) может принимать только конечное число значений в [0,1).Random.random()
генерирует свой вывод традиционным способом: выберите случайное целое число[0, 2**53)
и разделите на2**53
(53 - число бит в двойном). Таким образом,random()
возвращает 2 ** 53 равновероятных двойных чисел, и вы можете разделить это равномерно на N выходов, только если N - степень 2. Смещение мало для малого N, но посмотритеcollections.Counter(random.SystemRandom().randrange(3<<51)%6 for i in range(100000)).most_common()
. (Java. Random.nextInt () избегает такого смещения.)2**40
(то есть 1099511627776), будет достаточно маленьким, чтобы смещение не имело значения на практике? Это действительно должно быть указано в документации, потому что если кто-то не будет дотошным, он может не ожидать проблем с этой частью своего кода.random
используетсяgetrandbits
для получения достаточного количества бит для генерации результата для большихrandrange
s (random.choice
также использует это). Это верно как для 2.7, так и для 3.5. Используется толькоself.random() * len(seq)
когдаgetrandbits
недоступно. Это не делает глупость, о которой ты думаешь.Это код с переменной, которая определяет случайный индекс:
Это код без переменной:
И это код в кратчайшем и умном способ сделать это:
(Python 2.7)
источник
Следующий код демонстрирует, нужно ли вам производить одинаковые предметы. Вы также можете указать, сколько образцов вы хотите извлечь. Метод возвращает новый список , содержащий элементы населения, оставляя исходное население без изменений. Результирующий список находится в порядке выбора, так что все подрезы также будут действительными случайными выборками.
sample
источник
Случайный выбор товара:
Чтобы сохранить порядок списка, вы можете сделать:
Дубликат https://stackoverflow.com/a/49682832/4383027
источник
Мы также можем сделать это, используя randint.
источник
random.choice()
иrandom.randrange()
?None
только пинает банку в какую-то случайную точку позже, когда недопустимый «элемент» вызывает исключение; или, что еще хуже, вместо исключения вы получаете неверную программу и даже не знаете об этом.Вы могли бы просто:
источник