Шаг 55.
Python: сборник рецептов.
Числа, даты и время. Случайный выбор

    На этом шаге мы рассмотрим основные функции модуля random.

Задача

    Вы хотите выбрать случайные элементы из последовательности или сгенерировать случайные числа.

Решение

    Модуль random содержит разнообразные функции для генерации случайных чисел и выбора случайных элементов. Например, чтобы выбрать случайный элемент последовательности, используйте random.choice():

>>> import random
>>> values = [1, 2, 3, 4, 5, 6]
>>> random.choice(values)
4
>>> random.choice(values)
3
>>> random.choice(values)
2
>>> random.choice(values)
5
>>>

    Чтобы получить выборку из N элементов, используйте random.sample(). Каждый элемент выбирается один раз, так что если значения в полученной выборке повторяются, то это разные элементы оригинальной последовательности, имеющие одинаковое значение:

>>> random.sample(values, 2)
[3, 5]
>>> random.sample(values, 2)
[3, 1]
>>> random.sample(values, 3)
[6, 4, 1]
>>> random.sample(values, 3)
[1, 3, 5]
>>> 

    Если вы хотите перемешать элементы в последовательности, используйте random.shuffle():

>>> random.shuffle(values)
>>> values
[1, 6, 3, 2, 5, 4]
>>> random.shuffle(values)
>>> values
[4, 3, 6, 5, 1, 2]
>>> 

    Чтобы сгенерировать случайные целые числа, используйте random.randint():

>>> random.randint(0,10)
2
>>> random.randint(0,10)
5
>>> random.randint(0,10)
0
>>> random.randint(0,10)
7
>>> random.randint(0,10)
10
>>> random.randint(0,10)
3
>>>
Чтобы сгенерировать одинаковые по формату числа с плавающей точкой в диапазоне от 0 до 1, используйте random.random():
>>> random.random()
0.9406677561675867 
>>> random.random()
0.133129581343897 
>>> random.random()
0.4144991136919316
>>>

    Чтобы получить целое число из N случайных битов, используйте random.getrandbits():

>>> random.getrandbits(200)
1463781176887547047839333117275857110729979584424578184128600
>>> 


Обсуждение

    Модуль random вычисляет случайные числа, используя алгоритм "вихрь Мерсенна" (Mersenne twister, MT). Это детерминированный алгоритм, но вы можете изменить начальную инциализацию с помощью функции random.seed():

random.seed() # Инициализация на базе системного времени или os.urandom() 
random.seed(12345) # Инициализация на базе заданного целого числа 
random.seed(b'bytedata') # Инициализация на базе байтовых данных

    Вдобавок к уже продемонстрированной функциональности random включает функции для равномерного, гауссова и других распределений вероятности. Например, random.uniform() вычисляет равномерно распределенные числа, а random.gauss() - нормально распределенные. За описанием других поддерживаемых распределений обратитесь к документации.

    Функции в random не должны быть использованы в криптографических программах. Если вам нужна такая функциональность, обратитесь к функциям из модуля ssl. Например, ssl.RAND_bytes() может быть использована для генерации криптографически безопасных последовательностей случайных байтов.

    На следующем шаге мы рассмотрим базовые методы конвертации времени.




Предыдущий шаг Содержание Следующий шаг