Поиск…


Синтаксис

  • 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.x 3.6

Начиная с 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")


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow