Введение

Примеры

Случайные и последовательности: случайный выбор, выбор и выборка

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") 

Синтаксис

Параметры

Примечания