Введение
Примеры
Случайные и последовательности: случайный выбор, выбор и выборка
import random
shuffle()
Вы можете использовать random.shuffle()
, чтобы смешать / рандомизации элементы в изменяемом и индексируемой последовательности. Например, list
:
laughs = ["Hi", "Ho", "He"]
random.shuffle(laughs) # Shuffles in-place! Don't do: laughs = random.shuffle(laughs)
print(laughs)
# Out: ["He", "Hi", "Ho"] # Output may vary!
choice()
Принимает случайный элемент из последовательности произвольном:
print(random.choice(laughs))
# Out: He # Output may vary!
sample()
Как choice
он принимает случайные элементы из последовательности , но произвольной вы можете указать , сколько:
# |--sequence--|--number--|
print(random.sample( laughs , 1 )) # Take one element
# Out: ['Ho'] # Output may vary!
он не будет принимать один и тот же элемент дважды:
print(random.sample(laughs, 3)) # Take 3 random element from the sequence.
# Out: ['Ho', 'He', 'Hi'] # Output may vary!
print(random.sample(laughs, 4)) # Take 4 random element from the 3-item sequence.
ValueError: выборка больше, чем совокупность
Создание случайных целых чисел и чисел: randint, randrange, random и равномерное
import random
randint ()
Возвращает случайное число между x
и y
(включительно):
random.randint(x, y)
Например получать случайное число между 1
и 8
:
random.randint(1, 8) # Out: 8
randrange ()
random.randrange
имеет тот же синтаксис, что range
и в отличие от random.randint
, последнее значение не включено:
random.randrange(100) # Random integer between 0 and 99
random.randrange(20, 50) # Random integer between 20 and 49
random.rangrange(10, 20, 3) # Random integer between 10 and 19 with step 3 (10, 13, 16 and 19)
random()
Возвращает случайное число с плавающей запятой от 0 до 1:
random.random() # Out: 0.66486093215306317
uniform
Возвращает случайное число с плавающей точкой между x
и y
(включительно):
random.uniform(1, 8) # Out: 3.726062641730108
Воспроизводимые случайные числа: семя (seed) и состояние (state)
Установка определенного Seed создаст фиксированный ряд случайных чисел:
random.seed(5) # Create a fixed state
print(random.randrange(0, 10)) # Get a random integer between 0 and 9
# Out: 9
print(random.randrange(0, 10))
# Out: 4
Сброс начального числа создаст ту же самую «случайную» последовательность снова:
random.seed(5) # Reset the random module to the same fixed state.
print(random.randrange(0, 10))
# Out: 9
print(random.randrange(0, 10))
# Out: 4
Так как семя фиксируется эти результаты всегда 9
и 4
.Если иметь конкретные номера не требуется , только то , что значения будут тем же, также можно просто использовать getstate
и setstate
для восстановления предыдущего состояния:
save_state = random.getstate() # Get the current state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
random.setstate(save_state) # Reset to saved state
print(random.randrange(0, 10))
# Out: 5
print(random.randrange(0, 10))
# Out: 8
Для псевдо-рандомизации последовательности вы снова seed
с None
:
random.seed(None)
Или вызовите seed
метод без аргументов:
random.seed()
Создание криптографически безопасных случайных чисел
По умолчанию случайный модуль Python использовать Вихрь Мерсенна PRNG
для генерации случайных чисел, которые, хотя и пригодны в областях , таких как моделирование, не отвечает требованиям безопасности в более сложных условиях.
Для создания криптографически защищенного псевдослучайного числа, можно использовать SystemRandom
, которые, используя os.urandom
, может выступать в качестве криптографической защиты генератора псевдослучайных чисел, CPRNG .
Самый простой способ использовать это просто включает в себя инициализацию SystemRandom
класса. Предоставленные методы аналогичны тем, которые экспортируются случайным модулем.
from random import SystemRandom
secure_rand_gen = SystemRandom()
Для того чтобы создать случайную последовательность 10 int
s в диапазоне [0, 20]
, можно просто вызвать randrange()
:
print([secure_rand_gen.randrange(10) for i in range(10)])
# [9, 6, 9, 2, 2, 3, 8, 0, 9, 9]
Для того, чтобы создать случайное число в заданном диапазоне, можно использовать randint
:
print(secure_rand_gen.randint(0, 20))
# 5
и, соответственно, для всех других методов. Интерфейс точно такой же, единственным изменением является основной генератор чисел.
Вы можете также использовать os.urandom
непосредственно для получения криптографически безопасных случайных байт.
Создание случайного пароля пользователя
Для того , чтобы создать случайный пароль пользователя , можно использовать символы , представленные в string
модуле. В частности punctuation
для знаков пунктуации, ascii_letters
для букв и digits
для цифр:
from string import punctuation, ascii_letters, digits
Затем мы можем объединить все эти символы в имени с именем symbols
:
symbols = ascii_letters + digits + punctuation
Удалите любой из них, чтобы создать пул символов с меньшим количеством элементов.
После этого, мы можем использовать random.SystemRandom
для генерации пароля. Для пароля длиной 10:
secure_random = random.SystemRandom()
password = "".join(secure_random.choice(symbols) for i in range(10))
print(password) # '^@g;J?]M6e'
Обратите внимание , что другие процедуры , сделанные немедленно доступны в random
модуле - такие , как random.choice
, random.randint
и т.д. - не подходит для криптографических целей.
За кулисами, эти процедуры использовать Вихрь Мерсенна ПСЧ , который не удовлетворяет требованиям , предъявляемым к CSPRNG.Таким образом, в частности, вам не следует использовать какие-либо из них для создания паролей, которые вы планируете использовать. Всегда используйте экземпляр SystemRandom
, как показано выше.
Начиная с Python 3.6 доступен модуль `секреты`, который предоставляет криптографически безопасную функциональность. Процитировав [официальную документацию] [pydoc-secrets-3.6], чтобы сгенерировать * "десятибуквенный буквенно-цифровой пароль, содержащий как минимум один символ в нижнем регистре, как минимум один символ в верхнем регистре и как минимум три цифры", * вы можете: импортировать строку alphabet = string.ascii_letters + string.digits, а True: пароль = '' .join (выбор (алфавит) для i в диапазоне (10)) if (любой (c.islower () для c в пароле) и любой (c. isupper () для c в пароле) и sum (c.isdigit () для c в пароле)> = 3): break
Случайное двоичное решение
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")