Python Language
Случайный модуль
Поиск…
Синтаксис
- random.seed (a = None, version = 2) (версия доступна только для python 3.x)
- random.getstate ()
- random.setstate (состояние)
- random.randint (a, b)
- random.randrange (остановка)
- random.randrange (начало, остановка, шаг = 1)
- random.choice (сл)
- random.shuffle (x, random = random.random)
- random.sample (population, k)
Случайные и последовательности: перетасовка, выбор и выборка
import random
перетасовать ()
Вы можете использовать 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!
выбор()
Принимает случайный элемент из произвольной последовательности :
print(random.choice(laughs))
# Out: He # Output may vary!
образец()
Подобно 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)
случайный
Возвращает случайное число с плавающей запятой между 0 и 1:
random.random() # Out: 0.66486093215306317
единообразный
Возвращает случайное число с плавающей запятой между x
и y
(включительно):
random.uniform(1, 8) # Out: 3.726062641730108
Воспроизводимые случайные числа: семена и состояние
Установка определенного семени создаст фиксированную последовательность случайных чисел:
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 использует Merrenne Twister 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
и т. Д. - непригодны для криптографических целей.
За шторами эти подпрограммы используют Mersenne Twister PRNG , который не удовлетворяет требованиям CSPRNG . Таким образом, в частности, вы не должны использовать какой-либо из них для создания паролей, которые вы планируете использовать. Всегда используйте экземпляр SystemRandom
как показано выше.
Начиная с Python 3.6 доступен модуль secrets
, который предоставляет криптографически безопасную функциональность.
Цитируя официальную документацию , чтобы генерировать «десятизначный буквенно-цифровой пароль с хотя бы одним строчным символом, по крайней мере одним символом верхнего регистра и не менее трех цифр», вы могли бы:
import string
alphabet = string.ascii_letters + string.digits
while True:
password = ''.join(choice(alphabet) for i in range(10))
if (any(c.islower() for c in password)
and any(c.isupper() for c in password)
and sum(c.isdigit() for c in password) >= 3):
break
Случайное двоичное решение
import random
probability = 0.3
if random.random() < probability:
print("Decision with probability 0.3")
else:
print("Decision with probability 0.7")