Как написать генератор случайных чисел на python

«Генерация случайных чисел слишком важна, чтобы оставлять её на волю случая»

—  Роберт Кавью

Python порождает случайные числа на основе формулы, так что они не на самом деле случайные, а, как говорят, псевдослучайные [1]. Этот способ удобен для большинства приложений (кроме онлайновых казино) [2].

[1] Википедия: Генератор псевдослучайных чисел
[2] Доусон М. Программируем на Python. — СПб.: Питер, 2014. — 416 с.: ил. — 3-е изд

Модуль random позволяет генерировать случайные числа. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:

random.random¶

random.random() — возвращает псевдослучайное число от 0.0 до 1.0

random.random()
0.07500815468466127

random.seed¶

random.seed(<Параметр>) — настраивает генератор случайных чисел на новую последовательность. По умолчанию используется системное время. Если значение параметра будет одиноким, то генерируется одинокое число:

random.seed(20)
random.random()
0.9056396761745207

random.random()
0.6862541570267026

random.seed(20)
random.random()
0.9056396761745207

random.random()
0.7665092563626442

random.uniform¶

random.uniform(<Начало>, <Конец>) — возвращает псевдослучайное вещественное число в диапазоне от <Начало> до <Конец>:

random.uniform(0, 20)
15.330185127252884

random.uniform(0, 20)
18.092324756265473

random.randint¶

random.randint(<Начало>, <Конец>) — возвращает псевдослучайное целое число в диапазоне от <Начало> до <Конец>:

random.randint(1,27)
9
random.randint(1,27)
22

random.choince¶

random.choince(<Последовательность>) — возвращает случайный элемент из любой последовательности (строки, списка, кортежа):

random.choice('Chewbacca')
'h'
random.choice([1,2,'a','b'])
2
random.choice([1,2,'a','b'])
'a'

random.randrange¶

random.randrange(<Начало>, <Конец>, <Шаг>) — возвращает случайно выбранное число из последовательности.

random.shuffle¶

random.shuffle(<Список>) — перемешивает последовательность (изменяется сама последовательность). Поэтому функция не работает для неизменяемых объектов.

List = [1,2,3,4,5,6,7,8,9]
List
[1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(List)
List
[6, 7, 1, 9, 5, 8, 3, 2, 4]

Вероятностные распределения¶

random.triangular(low, high, mode) — случайное число с плавающей точкой, low N high. Mode — распределение.

random.betavariate(alpha, beta) — бета-распределение. alpha>0, beta>0. Возвращает от 0 до 1.

random.expovariate(lambd) — экспоненциальное распределение. lambd равен 1/среднее желаемое. Lambd должен быть отличным от нуля. Возвращаемые значения от 0 до плюс бесконечности, если lambd положительно, и от минус бесконечности до 0, если lambd отрицательный.

random.gammavariate(alpha, beta) — гамма-распределение. Условия на параметры alpha>0 и beta>0.

random.gauss(значение, стандартное отклонение) — распределение Гаусса.

random.lognormvariate(mu, sigma) — логарифм нормального распределения. Если взять натуральный логарифм этого распределения, то вы получите нормальное распределение со средним mu и стандартным отклонением sigma. mu может иметь любое значение, и sigma должна быть больше нуля.

random.normalvariate(mu, sigma) — нормальное распределение. mu — среднее значение, sigma — стандартное отклонение.

random.vonmisesvariate(mu, kappa)mu — средний угол, выраженный в радианах от 0 до 2π, и kappa — параметр концентрации, который должен быть больше или равен нулю. Если каппа равна нулю, это распределение сводится к случайному углу в диапазоне от 0 до 2π.

random.paretovariate(alpha) — распределение Парето.

random.weibullvariate(alpha, beta) — распределение Вейбулла.

Примеры¶

Генерация произвольного пароля¶

Хороший пароль должен быть произвольным и состоять минимум из 6 символов, в нём должны быть цифры, строчные и прописные буквы. Приготовить такой пароль можно по следующему рецепту:

import random
# Щепотка цифр
str1 = '123456789'
# Щепотка строчных букв
str2 = 'qwertyuiopasdfghjklzxcvbnm'
# Щепотка прописных букв. Готовится преобразованием str2
в верхний     регистр.
str3 = str2.upper()
print(str3)
# Выведет: 'QWERTYUIOPASDFGHJKLZXCVBNM'

# Соединяем все строки в одну
str4 = str1+str2+str3
print(str4)
# Выведет: '123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'

# Преобразуем получившуюся строку в список
ls = list(str4)
# Тщательно перемешиваем список
random.shuffle(ls)
# Извлекаем из списка 12 произвольных значений
psw = ''.join([random.choice(ls) for x in range(12)])
# Пароль готов
print(psw)
# Выведет: '1t9G4YPsQ5L7'

Этот же скрипт можно записать всего в две строки:

import random
print(''.join([random.choice(list('123456789qwertyuiopasdfghjklzxc
vbnmQWERTYUIOPASDFGHJKLZXCVBNM')) for x in range(12)]))

Данная команда является краткой записью цикла for, вместо неё можно было написать так:

import random
psw = '' # предварительно создаем переменную psw
for x in range(12):
    psw = psw + random.choice(list('123456789qwertyuiopasdfgh
jklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'))

print(psw)
# Выведет: Ci7nU6343YGZ

Данный цикл повторяется 12 раз и на каждом круге добавляет к строке psw произвольно выбранный элемент из списка.

Ссылки¶

  • Официальная документация по модулю random (англ.)
  • Python 3 для начинающих: Модуль random
  • Модуль random — генерация случайных чисел
  • Безопасность случайных чисел в Python

В данной статье мы рассмотрим процесс генерации случайных данных и чисел в Python. Для этого будет использован модуль random и некоторые другие доступные модули. В Python модуль random реализует генератор псевдослучайных чисел для различных распределений, включая целые и вещественные числа с плавающей запятой.

Содержание

  • Как использовать модуль random в Python
  • Генерация случайных чисел в Python
  • Выбор случайного элемента из списка
  • Python функции модуля random
  • Случайное целое число — randint(a, b)
  • Генерация случайного целого числа — randrange()
  • Выбор случайного элемента из списка choice()
  • Метод sample(population, k)
  • Случайные элементы из списка — choices()
  • Генератор псевдослучайных чисел — seed()
  • Перемешивание данных — shuffle()
  • Генерации числа с плавающей запятой — uniform()
  • triangular(low, high, mode)
  • Генератор случайной строки в Python
  • Криптографическая зашита генератора случайных данных в Python
  • getstate() и setstate() в генераторе случайных данных Python
  • Состояние генератора getstate()
  • Восстанавливает внутреннее состояние генератора — setstate()
  • Зачем нужны функции getstate() и setstate()
  • Numpy.random — Генератор псевдослучайных чисел
  • Генерация случайного n-мерного массива вещественных чисел
  • Генерация случайного n-мерного массива целых чисел
  • Выбор случайного элемента из массива чисел или последовательности
  • Генерация случайных универсально уникальных ID
  • Игра в кости с использованием модуля random в Python

Список методов модуля random в Python:

Метод Описание
seed() Инициализация генератора случайных чисел
getstate() Возвращает текущее внутренне состояние (state) генератора случайных чисел
setstate() Восстанавливает внутреннее состояние (state) генератора случайных чисел
getrandbits() Возвращает число, которое представляет собой случайные биты
randrange() Возвращает случайное число в пределах заданного промежутка
randint() Возвращает случайное число в пределах заданного промежутка
choice() Возвращает случайный элемент заданной последовательности
choices() Возвращает список со случайной выборкой из заданной последовательности
shuffle() Берет последовательность и возвращает ее в перемешанном состоянии
sample() Возвращает заданную выборку последовательности
random() Возвращает случайное вещественное число в промежутке от 0 до 1
uniform() Возвращает случайное вещественное число в указанном промежутке
triangular() Возвращает случайное вещественное число в промежутке между двумя заданными параметрами. Также можно использовать параметр mode для уточнения середины между указанными параметрами
betavariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Бета-распределении, которое используется в статистике
expovariate() Возвращает случайное вещественное число в промежутке между 0 и 1, или же между 0 и -1, когда параметр отрицательный. За основу берется Экспоненциальное распределение, которое используется в статистике
gammavariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Гамма-распределении, которое используется в статистике
gauss() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Гауссовом распределении, которое используется в теории вероятности
lognormvariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Логнормальном распределении, которое используется в теории вероятности
normalvariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на Нормальном распределении, которое используется в теории вероятности
vonmisesvariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на распределении фон Мизеса, которое используется в направленной статистике
paretovariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на распределении Парето, которое используется в теории вероятности
weibullvariate() Возвращает случайное вещественное число в промежутке между 0 и 1, основываясь на распределении Вейбулла, которое используется в статистике

Цели данной статьи

Далее представлен список основных операций, которые будут описаны в руководстве:

  • Генерация случайных чисел для различных распределений, которые включают целые и вещественные числа с плавающей запятой;
  • Случайная выборка нескольких элементов последовательности population;
  • Функции модуля random;
  • Перемешивание элементов последовательности. Seed в генераторе случайных данных;
  • Генерация случайных строки и паролей;
  • Криптографическое обеспечение безопасности генератора случайных данных при помощи использования модуля secrets. Обеспечение безопасности токенов, ключей безопасности и URL;
  • Способ настройки работы генератора случайных данных;
  • Использование numpy.random для генерации случайных массивов;
  • Использование модуля UUID для генерации уникальных ID.

В статье также даются ссылки на некоторые другие тексты сайта, связанные с рассматриваемой темой.

Для достижения перечисленных выше задач модуль random будет использовать разнообразные функции. Способы использования данных функций будут описаны в следующих разделах статьи.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

В самом начале работы необходимо импортировать модуль random в программу. Только после этого его можно будет полноценно использовать. Оператор для импорта модуля random выглядит следующим образом:

Теперь рассмотрим использование самого модуля random на простом примере:

import random

print(«Вывод случайного числа при помощи использования random.random()»)

print(random.random())

Вывод:

Вывод случайного числа при помощи использования random.random()

0.9461613475266107

Как видите, в результате мы получили 0.9461613475266107. У вас, конечно, выйдет другое случайно число.

  • random() является базовой функцией модуля random;
  • Почти все функции модуля random зависят от базовой функции random();
  • random() возвращает следующее случайное число с плавающей запятой в промежутке [0.0, 1.0].

Перед разбором функций модуля random давайте рассмотрим основные сферы их применения.

Генерация случайных чисел в Python

Давайте рассмотрим самый популярный случай использования модуля random — генерацию случайного числа. Для получения случайного целого числа в Python используется функция randint().

Для генерации случайных целых чисел можно использовать следующие две функции:

  • randint()
  • randrange()

В следующем примере показано, как получить случайно сгенерированное число в промежутке между 0 и 9.

from random import randint

print(«Вывод случайного целого числа «, randint(0, 9))

print(«Вывод случайного целого числа «, randrange(0, 10, 2))

Вывод:

Вывод случайного целого числа 5

Вывод случайного целого числа 2

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

Выбор случайного элемента из списка Python

Предположим, вам дан python список городов, и вы хотите вывести на экран случайно выбранный элемент из списка городов. Посмотрим, как это можно сделать:

import random

city_list = [‘New York’, ‘Los Angeles’, ‘Chicago’, ‘Houston’, ‘Philadelphia’]

print(«Выбор случайного города из списка — «, random.choice(city_list))

Вывод:

Выбор случайного города из списка Houston

Python функции модуля random

Рассмотрим разнообразные функции, доступные в модуле random.

Случайное целое число — randint(a, b) модуль random

  • Возвращает случайное целое число Number, такое что a <= Number <= b;
  • randint(a,b) работает только с целыми числами;
  • Функция randint(a,b) принимает только два параметра, оба обязательны;
  • Полученное в результате случайно число больше или равно a, а также меньше или равно b.

Пример использования random.randint() в Python:

import random

print(«Использование random.randint() для генерации случайного целого числа»)

print(random.randint(0, 5))

print(random.randint(0, 5))

Вывод:

Использование random.randint() для генерации случайного целого числа

4

2

Генерация случайного целого числа — randrange() модуль random

Метод random.randrange() используется для генерации случайного целого числа в пределах заданного промежутка. Скажем, для получения любого числа в диапазоне между 10 и 50.

Шаг показывает разницу между каждым числом заданной последовательности. Шаг по умолчанию равен 1, однако его значение можно изменить.

Пример использования random.randrange() в Python:

import random

print(«Генерация случайного числа в пределах заданного промежутка»)

print(random.randrange(10, 50, 5))

print(random.randrange(10, 50, 5))

Вывод:

Генерация случайного числа в пределах заданного промежутка

10

15

Выбор случайного элемента из списка choice() модуль random

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

Пример использования random.choice() в Python:

import random

list = [55, 66, 77, 88, 99]

print(«random.choice используется для выбора случайного элемента из списка — «, random.choice(list))

Вывод:

random.choice используется для выбора случайного элемента из списка 55

Метод sample(population, k) из модуля random

Метод random.sample() используется, когда требуется выбрать несколько элементов из заданной последовательности population.

  • Метод sample() возвращает список уникальных элементов, которые были выбраны из последовательности population. Итоговое количество элементов зависит от значения k;
  • Значение в population может быть представлено в виде списка или любой другой последовательности.

Пример использования random.sample() в Python:

import random

list = [2, 5, 8, 9, 12]

print («random.sample() «, random.sample(list,3))

Вывод:

random.sample() [5, 12, 2]

Случайные элементы из списка — choices() модуль random

  • random.choices(population, weights=None, *, cum_weights=None, k=1)
  • Метод random.choices() используется, когда требуется выбрать несколько случайных элементов из заданной последовательности.
  • Метод choices() был введен в версии Python 3.6. Он также позволяет повторять несколько раз один и тот же элемент.

Пример использования random.choices() в Python:

import random

# Выборка с заменой

list = [20, 30, 40, 50 ,60, 70, 80, 90]

sampling = random.choices(list, k=5)

print(«Выборка с методом choices «, sampling)

Вывод:

Выборка с методом choices [30, 20, 40, 50, 40]

Генератор псевдослучайных чисел —  seed() модуль random

  • Метод seed() используется для инициализации генератора псевдослучайных чисел в Python;
  • Модуль random использует значение из seed, или отправной точки как основу для генерации случайного числа. Если значения seed нет в наличии, тогда система будет отталкиваться от текущего времени.

Пример использования random.seed() в Python:

import random

random.seed(6)

print(«Случайное число с семенем «,random.random())

print(«Случайное число с семенем «,random.random())

Вывод:

Random number with seed  0.793340083761663

Random number with seed  0.793340083761663

Перемешивание данных — shuffle() из модуля random

Метод random.shuffle() используется для перемешивания данных списка или другой последовательности. Метод shuffle() смешивает элементы списка на месте. Самый показательный пример использования — тасование карт.

Пример использования random.shuffle() в Python:

list = [2, 5, 8, 9, 12]

random.shuffle(list)

print («Вывод перемешанного списка «, list)

Вывод:

Вывод перемешанного списка  [8, 9, 2, 12, 5]

Генерации числа с плавающей запятой — uniform() модуль random

  • random.uniform() используется для генерации числа с плавающей запятой в пределах заданного промежутка
  • Значение конечной точки может включаться в диапазон, но это не обязательно. Все зависит от округления значения числа с плавающей запятой;
  • Метод может, например, сгенерировать случайно вещественное число в промежутке между 10.5 и 25.5.

Пример использования random.uniform() в Python:

import random

print(«Число с плавающей точкой в пределах заданного промежутка»)

print(random.uniform(10.5, 25.5))

Вывод:

Число с плавающей точкой в пределах заданного промежутка

22.095283175159786

triangular(low, high, mode) из модуля random

Функция random.triangular() возвращает случайное вещественное число N с плавающей запятой, которое соответствует условию lower <= N <= upper, а также уточняющему значению mode.

Значение нижнего предела по умолчанию равно нулю, в верхнего — единице. Кроме того, пик аргумента по умолчанию установлен на середине границ, что обеспечивает симметричное распределение.

Функция random.triangular() используется в генерации случайных чисел для треугольного распределения с целью использования полученных значений в симуляции. Это значит, что в при генерации значения применяется треугольное распределение вероятности. 

Пример использования random.triangular() в Python:

import random

print(«Число с плавающей точкой через triangular»)

print(random.triangular(10.5, 25.5, 5.5))

Вывод:

Число с плавающей точкой через triangular

16.7421565549115

Генератор случайной строки в Python

В данном разделе будет подробно расписано, как сгенерировать случайную строку фиксированной длины в Python.

Основные аспекты раздела:

  • Генерация случайной строки фиксированной длины;
  • Получение случайной алфавитно-цифровой строки, среди элементов которой будут как буквы, так и числа;
  • Генерация случайного пароля, который будет содержать буквы, цифры и специальный символы.

Криптографическая зашита генератора случайных данных в Python

Случайно сгенерированные числа и данные, полученные при помощи модуля random в Python, лишены криптографической защиты. Следовательно, возникает вопрос — как добиться надежной генерации случайных чисел?

Криптографически надежный генератор псевдослучайных чисел представляет собой генератор чисел, который обладает особенностями, что делают его подходящим для использования в криптографических приложениях, где безопасность данных имеет первостепенное значение.

  • Все функции криптографически надежного генератора возвращают полученные случайным образом байты;
  • Значение случайных байтов, полученных в результате использования функции, зависит от источников ОС.
  • Качество генерации также зависит от случайных источников ОС.

Для обеспечения криптографической надежности генерации случайных чисел можно использовать следующие подходы:

  • Применение модуля secrets для защиты случайных данных;
  • Использование из модуля os os.urandom();
  • Использование класса random.SystemRandom.

Пример криптографически надежной генерации данных в Python:

import random

import secrets

number = random.SystemRandom().random()

print(«Надежное число «, number)

print(«Надежный токен байтов», secrets.token_bytes(16))

Вывод:

Надежное число 0.11139538267693572

Надежный токен байтов b‘xaexa0x91*.xb6xa1x05=xf7+>r;Yxc3’

getstate() и setstate() в генераторе случайных данных Python

Функции getstate() и setstate() модуля random позволяют зафиксировать текущее внутреннее состояние генератора.

Используя данные функции, можно сгенерировать одинаковое количество чисел или последовательностей данных.

Состояние генератора getstate() модуль random

Функция getstate() возвращает определенный объект, зафиксировав текущее внутреннее состояние генератора случайных данных. Данное состояние передается методу setstate() для восстановления полученного состояния в качестве текущего.

На заметку: Изменив значение текущего состояния на значение предыдущего, мы можем получить случайные данные вновь. Например, если вы хотите получить аналогичную выборку вновь, можно использовать данные функции.

Восстанавливает внутреннее состояние генератора — setstate() модуль random

Функция setstate() восстанавливает внутреннее состояние генератора и передает его состоянию объекта. Это значит, что вновь будет использован тот же параметр состояния state. Объект state может быть получен при помощи вызова функции getstate().

Зачем нужны функции getstate() и setstate() ?

Если вы получили предыдущее состояние и восстановили его, тогда вы сможете оперировать одними и теми же случайными данными раз за разом. Помните, что использовать другую функцию random в данном случае нельзя. Также нельзя изменить значения заданных параметров. Сделав это, вы измените значение состояния state.

Для закрепления понимания принципов работы getstate() и setstate() в генераторе случайных данных Python рассмотрим следующий пример:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

import random

number_list = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

print(«Первая выборка «, random.sample(number_list,k=5))

# хранит текущее состояние в объекте state

state = random.getstate()

print(«Вторая выборка «, random.sample(number_list,k=5))

# Восстанавливает состояние state, используя setstate

random.setstate(state)

#Теперь будет выведен тот же список второй выборки

print(«Третья выборка «, random.sample(number_list,k=5))

# Восстанавливает текущее состояние state

random.setstate(state)

# Вновь будет выведен тот же список второй выборки

print(«Четвертая выборка «, random.sample(number_list,k=5))

Вывод:

Первая выборка  [18, 15, 30, 9, 6]

Вторая выборка  [27, 15, 12, 9, 6]

Третья выборка  [27, 15, 12, 9, 6]

Четвертая выборка  [27, 15, 12, 9, 6]

Как можно заметить в результате вывода — мы получили одинаковые наборы данных. Это произошло из-за сброса генератора случайных данных.

Numpy.random — Генератор псевдослучайных чисел

PRNG является англоязычным акронимом, который расшифровывается как «pseudorandom number generator» — генератор псевдослучайных чисел. Известно, что в Python модуль random можно использовать для генерации случайных скалярных числовых значений и данных.

  • Для генерации массива случайных чисел необходимо использовать numpy.random();
  • В модуле numpy есть пакет numpy.random, который содержит обширный набор функций для генерации случайных n-мерных массивов для различных распределений.

Рассмотрим несколько примеров использования numpy.random в Python.

Генерация случайного n-мерного массива вещественных чисел

  • Использование numpy.random.rand() для генерации n-мерного массива случайных вещественных чисел в пределах [0.0, 1.0)
  • Использование numpy.random.uniform() для генерации n-мерного массива случайных вещественных чисел в пределах [low, high)

import numpy

random_float_array = numpy.random.rand(2, 2)

print(«2 X 2 массив случайных вещественных чисел в [0.0, 1.0] n», random_float_array,«n»)

random_float_array = numpy.random.uniform(25.5, 99.5, size=(3, 2))

print(«3 X 2 массив случайных вещественных чисел в [25.5, 99.5] n», random_float_array,«n»)

Вывод:

2 X 2 массив случайных вещественных чисел в [0.0, 1.0]

[[0.08938593 0.89085866]

[0.47307169 0.41401363]]

3 X 2 массив случайных вещественных чисел в [25.5, 99.5]

[[55.4057854  65.60206715]

[91.62185404 84.16144062]

[44.348252   27.28381058]]

Генерация случайного n-мерного массива целых чисел

Для генерации случайного n-мерного массива целых чисел используется numpy.random.random_integers():

import numpy

random_integer_array = numpy.random.random_integers(1, 10, 5)

print(«1-мерный массив случайных целых чисел n», random_integer_array,«n»)

random_integer_array = numpy.random.random_integers(1, 10, size=(3, 2))

print(«2-мерный массив случайных целых чисел n», random_integer_array)

Вывод:

1мерный массив случайных целых чисел

[10  1  4  2  1]

2мерный массив случайных целых чисел

[[ 2  6]

[ 9 10]

[ 3  6]]

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

  • Использование numpy.random.choice() для генерации случайной выборки;
  • Использование данного метода для получения одного или нескольких случайных чисел из n-мерного массива с заменой или без нее.

Рассмотрим следующий пример:

import numpy

array =[10, 20, 30, 40, 50, 20, 40]

single_random_choice = numpy.random.choice(array, size=1)

print(«один случайный выбор из массива 1-D», single_random_choice)

multiple_random_choice = numpy.random.choice(array, size=3, replace=False)

print(«несколько случайных выборов из массива 1-D без замены», multiple_random_choice)

multiple_random_choice = numpy.random.choice(array, size=3, replace=True)

print(«несколько случайных выборов из массива 1-D с заменой», multiple_random_choice)

Вывод:

один случайный выбор из массива 1D [40]

несколько случайных выборов из массива 1D без замены [10 40 50]

несколько случайных выборов из массива 1D с заменой [20 20 10]

В будущих статьях будут описаны другие функции пакета random из nympy и способы их использования.

Генерация случайных универсально уникальных ID

Модуль Python UUID предоставляет неизменяемые UUID объекты. UUID является универсально уникальным идентификатором.

У модуля есть функции для генерации всех версий UUID. Используя функцию uuid.uuid4(), можно получить случайно сгенерированное уникальное ID длиной в 128 битов, которое к тому же является криптографически надежным.

Полученные уникальные ID используются для идентификации документов, пользователей, ресурсов и любой другой информации на компьютерных системах.

Пример использования uuid.uuid4() в Python:

import uuid

# получить уникальный UUID

safeId = uuid.uuid4()

print(«безопасный уникальный id «, safeId)

Вывод:

безопасный уникальный id  fb62463acd934f5491ab72a2e2697aff

Игра в кости с использованием модуля random в Python

Далее представлен код простой игры в кости, которая поможет понять принцип работы функций модуля random. В игре два участника и два кубика.

  • Участники по очереди бросают кубики, предварительно встряхнув их;
  • Алгоритм высчитывает сумму значений кубиков каждого участника и добавляет полученный результат на доску с результатами;
  • Участник, у которого в результате большее количество очков, выигрывает.

Код программы для игры в кости Python:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import random

PlayerOne = «Анна»

PlayerTwo = «Алекс»

AnnaScore = 0

AlexScore = 0

# У каждого кубика шесть возможных значений

diceOne = [1, 2, 3, 4, 5, 6]

diceTwo = [1, 2, 3, 4, 5, 6]

def playDiceGame():

    «»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

    for i in range(5):

        #оба кубика встряхиваются 5 раз

        random.shuffle(diceOne)

        random.shuffle(diceTwo)

    firstNumber = random.choice(diceOne) # использование метода choice для выбора случайного значения

    SecondNumber = random.choice(diceTwo)

    return firstNumber + SecondNumber

print(«Игра в кости использует модуль randomn»)

#Давайте сыграем в кости три раза

for i in range(3):

    # определим, кто будет бросать кости первым

    AlexTossNumber = random.randint(1, 100) # генерация случайного числа от 1 до 100, включая 100

    AnnaTossNumber = random.randrange(1, 101, 1) # генерация случайного числа от 1 до 100, не включая 101

    if( AlexTossNumber > AnnaTossNumber):

        print(«Алекс выиграл жеребьевку.»)

        AlexScore = playDiceGame()

        AnnaScore = playDiceGame()

    else:

        print(«Анна выиграла жеребьевку.»)

        AnnaScore = playDiceGame()

        AlexScore = playDiceGame()

    if(AlexScore > AnnaScore):

        print («Алекс выиграл игру в кости. Финальный счет Алекса:», AlexScore, «Финальный счет Анны:», AnnaScore, «n»)

    else:

        print(«Анна выиграла игру в кости. Финальный счет Анны:», AnnaScore, «Финальный счет Алекса:», AlexScore, «n»)

Вывод:

Игра в кости использует модуль random

Анна выиграла жеребьевку.

Анна выиграла игру в кости. Финальный счет Анны: 5 Финальный счет Алекса: 2

Анна выиграла жеребьевку.

Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 2

Алекс выиграл жеребьевку.

Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 8

Вот и все. Оставить комментарии можете в секции ниже.

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

E-mail: vasile.buldumac@ati.utm.md

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»

Содержание:развернуть

  • Как работают случайные числа
  • Модуль random
  • Случайные целые числа (int)

  • Случайные вещественные числа (float)

  • Случайные элементы из последовательности

  • Управление генератором

  • Вероятностное распределение

  • Best practices
  • Случайная задержка (random sleep)

  • Случайны элемент из списка (с учетом веса)

  • Случайный пароль

Случайные числа применяются в программировании в разных случаях, например, для моделирования процессов и в видеоиграх. Для начала разберёмся, какую последовательность можно назвать случайной.

Случайной последовательностью называют набор элементов, полученных таким образом, что любой элемент их этого набора никак не связан ни с каким другим элементом. При этом в программировании обычно последовательность не является строго случайной — в ней для генерации следующего элемента используется предыдущий.

Как работают случайные числа

Полностью случайные числа генерируются истинным генератором случайных чисел (TRNG). Их можно получить, например, бросанием кубика или доставанием шаров из урны. Так как подобных устройств нет в компьютере, то в нем можно получить только «псевдослучайные» числа.

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

Чтобы понять, как работают генераторы псевдослучайных чисел, рассмотрим работу одного из первых подобных генераторов. Его алгоритм работы был разработан Нейманом. В нем первое число возводят в квадрат, а потом из полученного результата берут средние цифры. Например, первое число 281, возводим его в квадрат, получаем 78961 и берем три цифры, находящиеся в середине – 896. После этого для генерации следующего числа используем 896.

Модуль random

В модуле random реализованы различные генераторы псевдослучайных чисел. Здесь присутствуют методы, с помощью которых можно получить равномерное, Гауссовское, бета и гамма распределения и другие функции. Практически все они зависят от метода random(). В Python, в качестве основного, используется генератор псевдослучайных чисел Mersenne Twister, который выдает 53-х битные вещественные числа.

👉 Как использовать: чтобы начать использовать встроенные генераторы случайных чисел, нужно сначала подключить модуль рандом:

import random

После этого можно вызывать методы модуля random:

random.randint(0, 125)

В модуле random существуют методы для генерации целых чисел, с плавающей точкой, для работы с последовательностями. Кроме этого существуют функции для управления генератором и генерации различных последовательностей. Рассмотрим основные из этих методов.

Случайные целые числа (int)

Перечислим основные функции, которые есть в модуле random для выдачи случайных целых чисел.

randint
Функция randint(a, b) получает на вход два целых числа и возвращает случайное значение из диапазона [a, b] (a и b входят в этот диапазон).

import random

random_number = random.randint(0, 125)
print(random_number)

> 113

randrange
В функцию randrange(start, stop[, step]) передают три целых числа:

  • start – начало диапазона (входит в последовательность);
  • stop – конец диапазона (в последовательность не входит);
  • step – шаг генерации (если на его месте написать 0, получим ошибку «ValueError»).

На выходе функция выдает случайное число в заданном диапазоне.

import random

random_number = random.randrange(1, 100, 2)
print(random_number)

> 43

Случайные вещественные числа (float)

Перечислим функции, которые выдают вещественные числа.

random
Функция random() выдает вещественные числа, в диапазоне [0.0, 1.0) (включая 0.0, но не включая 1.0).

import random

random_number = random.random()
print(random_number)

> 0.47673250896173136

uniform
Сгенерировать число с плавающей точкой можно с помощью функции uniform(a, b). При этом полученное число будет в диапазоне [a, b) или [a, b] (a входит в диапазон, а вхождение b зависит от округления).

import random

random_number = random.uniform(7.3, 10.5)
print(random_number)

> 10.320165816501492

Случайные элементы из последовательности

В модуле random языка Python есть несколько функций, которые можно применять для работы с последовательностями.

choice
С помощью функции choice(seq) можно выбрать один элемент из набора данных. В качестве единственного аргумента в функцию передаётся последовательность. Если последовательность будет пустой (то есть в ней не будет ни одного элемента), получим ошибку «IndexError».

import random

seq = [10, 11, 12, 13, 14, 15]
random_element = random.choice(seq)
print(random_element)

> 12

choices
С помощью функции
choices(seq [, weights, cum_weights, k]) можно выбрать 1 или несколько элементов из набора данных. weights, cum_weights и k — необязательные параметры.

  • weights — список относительных весов;
  • cum_weights — список кумулятивных (совокупных) весов, например weights [10, 5, 30, 5] эквивалентен cum_weights [10, 15, 45, 50].
  • k — длина возвращаемого списка (она может быть больше длины переданной последовательности и элементы могут дублироваться).

import random

seq = [1, 2, 3, 4, 5, 6]
random_elements = random.choices(seq, weights=[20, 1.1, 1, 2.1, 10, 1], k=4)
print(random_elements)

> [5, 1, 1, 5]

shuffle
Перемешать элементы набора данных можно с помощью функции shuffle(x[, random]).

  • х — последовательность;
  • random (необязательный параметр) — задает метод вероятностных распределений. Этот параметр не рекомендуется использовать в версии Python 3.9, а в версии 3.11 его поддержка будет прекращена.

shuffle перемешивает переданную последовательность, и возвращает None.

import random

seq = ["Cappuccino", "Latte", "Espresso", "Americano"]
random.shuffle(seq)
print(seq)

> ['Espresso', 'Americano', 'Latte', 'Cappuccino']

sample
Чтобы выбрать какое-то количество элементов из набора данных можно воспользоваться функцией sample(х, k).

  • х — последовательность;
  • k — количество элементов новой подпоследовательности.

На выходе получаем k уникальных случайных элементов из последовательности.

Если в исходной последовательности есть неуникальные (повторяющиеся) элементы, то каждый их них может появиться в новом списке.

import random

seq = [10, 11, 12, 11, 14, 11]
random_seq = random.sample(seq, 4)
print(random_seq)

> [10, 11, 11, 14]

Управление генератором

Генерация чисел в Python не совсем случайна и зависит от состояния генератора случайных чисел. Рассмотрим функции, с помощью которых можно управлять состоянием этого генератора.

getstate
Метод getstate() модуля random возвращает объект, в котором записано текущим состояние генератора случайных чисел. Его можно использовать для восстановления состояния генератора. Эта функция не имеет параметров.

import random

print(random.getstate())

> (3, (2147483648, 3570748448, 2839542888, 4273933825, 4291584237, ...

setstate
Метод setstate(state) применяется для восстановления состояния генератора случайных чисел. Обычно его используют совместно с методом getstate(). В качестве параметра в функцию передается объект состояния генератора, полученный, например, с помощью функции getstate().

import random

state = random.getstate() # сохраняем текущее состояние генератора
random_number_1 = random.random() # получаем случайное число
print(random_number_1)
# > 0.42164837822065193 # первое случайное число

random_number_2 = random.random()
print(random_number_2)
# > 0.2486825504535808 # второе случайное число

random.setstate(state) # восстанавливаем состояние генератора
random_number_3 = random.random() # снова генерируем число
print(random_number_3)
# > 0.42164837822065193 # новое число равное первому, сгенерированному с тем же состояние генератора

seed
Генератору случайных чисел нужно число, основываясь на котором он сможет начать генерировать случайные значения.

Задать начальное значение можно с помощью метода seed(a=None, version=2).

  • а — начальное число, с которого начинается генерация. Этот параметр не обязательный. Если он не задан, используется текущее системное время (или доступный механизм генерации, предоставляемый ОС);
  • version — стратегия интерпретации первого аргумента. По умолчанию используется версия 2, при которой str, bytes и bytearray преобразуются в int. Версия 1 (используется для совместимости со старыми версиями Python) и в ней для str и bytes генерирует более узкий диапазон начальных значений.

Вероятностное распределение

В теории вероятностей важную роль играет понятие распределение вероятностей. Оно показывает с какой вероятность может наступить каждое из возможных событий. С его помощью можно моделировать как наступление дискретных событий (например, бросание монеты, количество телефонных разговоров за неделю, количество пассажиров в автобусе), так и непрерывных (например, длительность разговора, количество осадков за год, расход электричества за месяц).

Для наглядности рассмотрим самое распространенное нормальное распределение вероятностей. На рисунке ниже приведена кривая нормального распределения.

В модуле random существуют функции, которые позволяют использовать различные методы вероятностных распределений:

  • triangular(a, b, mode) — генерирует случайное вещественное число, находящееся в диапазоне от a до b. По умолчанию эти параметры равны: а = 0, b = 1. Третий параметр mode задает среднюю точку вероятности распределения. (подробнее про треугольное распределение тут).
  • betavariate(alpha, beta) — генерирует случайные числа соответствующие параметрам бета-распределения. Возвращаемые значения лежат в диапазоне от 0 до 1.
  • expovariate(lambd) — можно получить случайные значения, соответствующие экспоненциальному распределению. Если lambd положительное, то на выходе будут значения от 0 до +∞, а если отрицательное, то от -∞ до 0.
  • gammavariate(alpha, beta) — на выходе получаются случайные числа, соответствующие гамма распределению. Параметры alpha и beta, передаваемые в функцию должны быть больше 0.
  • gauss(mu, sigma) — на выходе получаются случайные числа, которые соответствуют Гауссовому распределению. В этот метод передаются два параметра: mu — среднее значение и sigma — среднеквадратичное отклонение.
  • lognormvariate(mu, sigma) — генерирует случайные значения соответствующие логарифму нормального распределения. То есть если вычислить натуральный логарифм полученного распределения, то в результате получится нормальное распределение с параметрами mu (среднее) и sigma (среднеквадратичное отклонение).
  • normalvariate(mu, sigma) — предназначен для генерации случайных значений подчиняющихся закону нормального распределения. В качестве параметров передаются: mu — среднее распределения и sigma — стандартное отклонение.
  • vonmisesvariate(mu, kappa) — используется для возврата случайного числа с плавающей запятой с распределением фон Мизеса (или круговым нормальным распределением).
  • paretovariate(alpha) — выдает случайные числа, соответствующие распределению Парето. Параметр alpha задает форму.
  • weibullvariate(alpha, beta) — Значения, выдаваемые weibullvariate соответствуют распределению Вейбулла. Параметр alpha задает масштаб, а beta форму.

💭 Ознакомиться со всеми функциями модуля random можно на официальном сайте Python в разделе документация.

Best practices

Приведем несколько примеров использования случайных чисел.

Случайная задержка (random sleep)

Иногда необходимо сделать так, чтобы программа работала с задержками. Например, это актуально при парсинге сайта (при частых запросах некоторые сайты могут вас банить).

import random
import time

page_list = ["site.ru/page1", "site.ru/page2", "site.ru/page3"]

for page in page_list:
#
# some actions
#
time.sleep(random.randint(1, 3)) # задержка от 1 до 3 секунд

💭 Для имитации действий человека можно использовать random.uniform(1, 3) — это добавит случайные миллисекунды к вашим задержкам.

Случайны элемент из списка (с учетом веса)

Дано: веб-сайт. В базе данных 4 баннера, к каждому баннеру указан вес (приоритет к показу).

Необходимо рандомно показывать на сайте 1 баннер, в зависимости от его веса.

import random

# данные из БД
hero_banners = [
{
"id": 1,
"name": "SupermanBanner",
"weight": 5,
},
{
"id": 2,
"name": "BatmanBanner",
"weight": 40,
},
{
"id": 3,
"name": "FlashBanner",
"weight": 5,
},
{
"id": 4,
"name": "AquamanBanner",
"weight": 40,
}
]

banner_weights = [banner['weight'] for banner in hero_banners]
my_banner = random.choices(hero_banners, banner_weights)[0]
print(my_banner)

> {'id': 2, 'name': 'BatmanBanner', 'weight': 40}

Случайный пароль

С помощью генератора случайных чисел можно создавать пароли. Например, сгенерировать стойкий пароль можно так:

import random
import string

pwd_length = 0
while pwd_length < 12:
pwd_length = int(input('Укажите длину пароля (от 12 символов): '))

# набор данных (заглавные и строчные буквы, цифры, символы пунктуации)
UPPERCASE_CHARACTERS = string.ascii_uppercase
LOWERCASE_CHARACTERS = string.ascii_lowercase
DIGITS = string.digits
SYMBOLS = string.punctuation

# весь набор
combined_list = UPPERCASE_CHARACTERS + LOWERCASE_CHARACTERS + DIGITS + SYMBOLS

# случайный элемент из каждого набора
rand_upper = random.choice(UPPERCASE_CHARACTERS)
rand_lower = random.choice(LOWERCASE_CHARACTERS)
rand_digit = random.choice(DIGITS)
rand_symbol = random.choice(SYMBOLS)

#
temp_pwd = random.sample(combined_list, pwd_length - 4) + [rand_upper, rand_lower, rand_digit, rand_symbol]
random.shuffle(temp_pwd)
password = "".join(temp_pwd)

print(password)

> Укажите длину пароля (от 12 символов): 12
> JFyc;6-ICxuQ

В данном примере будет сгенерирован пароль, содержащий минимум 12 символов, среди которых точно будет маленькая буква, большая буква, цифра и символ.


Методы модуля random позволяют получить случайные данные с использованием Mersenne Twister. Однако имейте в виду, что данный способ не является криптографически безопасным (для генерирования паролей есть более надежные варианты).

Кроме модуля random, в Python существуют альтернативные модули, позволяющие получить случайное значения:

  • numpy.random — как random, но для массивов;
  • os — в состав входит urandom() [криптографически безопасный];
  • secrets — модуль для генерации безопасных случайных чисел, байтов и строк [криптографически безопасный];
  • uuid — содержит нескольких функций для создания 128-битных идентификаторов [криптографически безопасный].

В процессе программирования на Python может понадобиться случайное число. О том, как создать собственный простейший генератор псевдослучайных чисел и пойдет разговор в этой статье. Будут рассмотрены некоторые популярные методы и функции, которые включены в модуль random для Python 3 и позволяют получать значения случайным образом (randomly).

В качестве лирического отступления следует сказать, что, согласно специфике внутреннего состояния генератора, модуль для Python под названием random позволяет сгенерировать не случайный, а псевдослучайный элемент, то есть значения и их последовательности формируются на основе формулы. Раз последовательность зависит от нескольких параметров, она не является случайной в полном смысле этого слова. Если нужна истинная случайность, генерация может основываться, к примеру, на принципах квантовой механики, однако на практике это слишком дорого и сложно, да и не всегда экономически целесообразно, ведь для многих задач программирования вполне подойдут и псевдослучайные генераторы (если речь идет не про онлайн-казино). Вдобавок к этому, случайность (randomness) — вещь капризная, поэтому, как тут не вспомнить прекрасное высказывание американского математика Роберта Кавью:

Также на ум приходит еще одно интересное высказывание, но уже от выдуманного персонажа и с некоторым уклоном в философию:

Применение random в Python

В языке программирования «Пайтон» модуль random позволяет реализовывать генератор псевдослучайных чисел для разных распределений, куда входят как целые (integers), так и вещественные числа, то есть числа с плавающей запятой.

Общий список методов, поддерживаемых модулем random, можно посмотреть в таблице ниже. Тут стоит обратить внимание, что возврат значений может осуществляться на основе разных распределений (распределение Парето, распределение Вейбулла и т. д.), выбор которых зависит от области применения генератора случайных чисел (статистика, теория вероятности).

Но мы не будем углубляться в распределения, а рассмотрим самые простые методы. А так как разглядывать их в таблице совершенно неинтересно, давайте попрактикуемся и выясним, как может быть использован тот или иной метод в деле.

Но прежде чем это сделать и иметь возможность полноценно использовать модуль, его надо импортировать. Делается это предельно просто: нужно прописать в начале кода import random.

random.random

У модуля random есть одноименный метод-тезка — функция random. Она возвращает случайное число в диапазоне 0 — 1.0:

import random

print("Выводим случайное число с помощью random.random():")

print(random.random())

Если вы скопируете этот простейший код себе (можно использовать любой онлайн-компилятор), вы получите другое число.

Также вывести можно не одно, а, к примеру, три (three) числа (используется for i in range), причем прекрасным решением будет ограничить вывод до двух знаков после запятой (за это отвечает ‘%.2f’):

import random

print("Выводим 3 случайных числа; не более 2 знаков после запятой:")

print(['%.2f' % random.random() for i in range(3)])

random.seed

Метод seed может показаться более сложным для понимания. Фишка в том, что, как уже было сказано выше, используется генератор псевдослучайных чисел, то есть выдача этих чисел происходит в соответствии с алгоритмом. Алгоритм вычисляет значение на основе другого числа, но это число берется не с потолка — оно вычисляется на основании текущего системного времени. В результате, если вы будете пробовать на своем компьютере один из кодов, рассмотренных выше, вы будете получать каждый раз новые числа.

Если же задействовать seed с одним и тем же параметром, то вычисление будет производиться на основании этого параметра. Итог — на выходе будут получаться одинаковые «случайные» значения. Возьмем для примера параметр 5 и сделаем так, чтобы метод отработал дважды:

import random

random.seed(5)

print(random.random())

random.seed(5)

print(random.random())

random.uniform

С uniform все проще: возвращается псевдослучайное вещественное число, находящееся в определенном диапазоне, который указывается разработчиком:

import random

print("Находим число с плавающей точкой в заданном диапазоне:")

print(random.uniform(5, 10))

random.randint

Randint в Python тоже позволяет вернуть псевдослучайное число в определенном диапазоне, но тут уже речь идет о целом значении (int, integer):

import random

print("Используем randint для генерации целого числа int из диапазона:")

print(random.randint(10, 20))

random.randrange

Следующий метод, называемый randrange, похож на предыдущий randint, но тут, кроме диапазона целых значений int, можно добавить еще и шаг выборки (в качестве третьего параметра):

import random

print("Генерируем случайное целое число в заданном диапазоне с шагом")

print(random.randrange(10, 100, 2))

Судя по результату ниже и в соответствии с выбранным диапазоном от 10 до 100, установив шаг 2, мы будем получать лишь четные значения:

random.choice

Применение choice позволяет вернуть элемент из какой-нибудь последовательности — это может быть список, строка, кортеж.

И это уже интереснее, т. к. напрашивается аналогия с броском игрального кубика:

import random

list = [1, 2, 3, 4, 5, 6]

print("Выборка одного элемента из списка с помощью choice:")

print(random.choice(list))

Ура, выпало шесть!

Проверьте, повезет ли так и вам. Но вообще, перечень может состоять из других цифр и даже слов.

Сыграйте в игру и попробуйте погадать, какой язык программирования вам лучше учить в Otus:

import random

list = ['Python','Java','C#','C++','PHP','C','JavaScript','Scala']

print("Какой язык программирования будешь учить?")

print(random.choice(list))

Sample и choices

Начиная с Python 3.6, появился метод choices. Его отличие в том, что он позволяет сделать выборку нескольких элементов из последовательности, а вот сколько именно будет значений, можно указать. В отличие от схожего метода sample, в choices возможно получение одинаковых цифр.

Вернемся к нашему виртуальному кубику. Вот работа sample:

import random

list = [1, 2, 3, 4, 5, 6]

print ("Выборка двух случайных значений:")

print (random.sample(list,2))

Все бы ничего, но этот метод будет постоянно выводить 2 разных значения. Если же мы захотим сымитировать бросок двух игральных кубиков, код придется менять, ведь в реальной жизни выкинуть дубль все-таки можно. Но зачем менять код, если есть choices? Он обеспечит вывод двух случайных значения из заданного диапазона, причем они могут повторяться. Это уже максимально приближено к реальному броску двух кубиков, причем профит достигается и за счет того, что объем кода не увеличивается. Ради интереса мы его даже уменьшили — оптимизировали (List превратился в l, да и лишний текст выкинули):

import random

l = [1,2,3,4,5,6]

print(random.choices(l, k=2))

Кстати, вот и дубль — результат равен [6, 6], причем всего лишь с 5-й попытки (можете поверить на слово):

Правда, тут нюанс: пришлось сменить онлайн-компилятор, так как на предыдущем компиляторе Python версии 3.6 не поддерживался.

random.shuffle

Функция с интересным названием shuffle может перемешивать последовательность, меняя местами значения (она не подходит для неизменяемых объектов). Здесь важна именно последовательность выпадения определенных значений, как в лото.  

import random

list = [1,2,3,4,5,6,7,8,9,10]

random.shuffle(list)

print ("Крутим барабан и достаем шары наугад: ", list)

Остается добавить, что английское слово shuffle означает «тасовать, перемешивать». Как тут не вспомнить картежного шулера или лопату-шуфлю для перемешивания бетонного раствора. Но это так, для общего развития.

Успехов вам, друзья!

In this tutorial, you’ll learn how to generate random numbers in Python. Being able to generate random numbers in different ways can be an incredibly useful tool in many different domains. Python makes it very easy to generate random numbers in many different ways.

In order to do this, you’ll learn about the random and numpy modules, including the randrange, randint, random, and seed functions. You’ll also learn about the uniform and normal functions in order to create more controlled random values.

By the end of this tutorial, you’ll have learned:

  • How to generate random floating point values and integers
  • How to generate random numbers between different values
  • How to create lists of random numbers
  • How to generate a random number following a gaussian distribution

Generate Random Floating Point Value in Python

Python comes with a package, random, built in. This means that you don’t need to install any additional libraries. The library makes it incredibly easy to generate random numbers. Let’s first see how to create a random floating point between 0 and 1.

# Generate a random float between 0 and 1
import random
print(random.random())

# Returns: 0.9853067530373302

Let’s break down what we did here:

  1. We imported the random library
  2. We used the .random() function from the library

The random() function is used to generate a random float between 0 and 1.

Generate a Random Float Between 2 Numbers

While the random() function generates a random float between 0 and 1. However, there may be times you want to generate a random float between any two values. For this, you can use the .uniform() function. Let’s see how this works:

# Generating a random float between two numbers
import random
print(random.uniform(10, 20))

# Returns: 18.754091000858978

You can see that the random number that’s returned is between (and can include) the boundary numbers.

In the next section, you’ll learn how to generate a random integer in Python.

The random library makes it equally easy to generate random integer values in Python. For this, you can use the randint() function, which accepts two parameters:

  • a= is the low end of the range, which can be selected
  • b= is the high end of the range, which can also be selected

Let’s see how we can generate a random integer in Python:

# Generating a random integer in Python
import random
print(random.randint(0,10))

# Returns: 6

Generate Random Numbers Between Two Values in Python

In the example above, we used 0 as the starting point. However, if we wanted to generate a random number between two values, we can simply specify a different value as the starting point (including negative values).

Let’s repeat this example by picking a random integer between -100 and 100:

# Generating a random integer between two values
import random
print(random.randint(-100,100))

# Returns: -24

Generate Random Numbers Between Two Values at Particular Steps in Python

In this section, you’ll learn how to generate random numbers between two values that increase at particular steps. This means that say you wanted to choose a random number between, say, 0 and 100, but only in multiples of 3.

For this, you can use the randrange() function. Let’s see how this works:

# Choosing a Random Value from a Range
import random
print(random.randrange(0,100,3))

# Returns: 51

The important piece to note here is that the upper limit number is not included in the selection. In order to include it, simply add 1 to the value, such as random.randrange(0, 101, 3).

Generate a List of Random Numbers in Python

In this section, you’ll learn how to generate a list of random numbers in Python. Because this can be done in different ways, we’ll split this section into multiple parts. By the end of this, you’ll learn how to select a list of random floats, random integers, and random integers without repetition.

Generate a List of Random Floats

In order to generate a list of random floats, we can simply call the .random() or .uniform() functions multiple times. We can use either a for loop or a list comprehension.

In the examples below, we’ll use a Python list comprehension to generate two lists: one with random floats between 0 and 1 and the other with random floats between two specified numbers:

# Generate a list of random floats between 0 and 1
import random

random_list = [random.random() for i in range(4)]
print(random_list)

# Returns: [0.5581711161676459, 0.12711142718586899, 0.766167958409145, 0.16922239303028397]

Let’s break down what we did here:

  1. We instantiated a new list, random_list which holds a list comprehension
  2. The list comprehension repeats calling the .random() function 4 times.

We can apply the same approach to create a list of random floats between two given numbers:

# Generate a list of random floats between 10 and 30
import random

random_list = [random.uniform(10, 30) for i in range(4)]
print(random_list)

# Returns: [17.8132149201385, 25.11003157219303, 10.68442113276928, 24.26692625415757]

Generate a List of Random Integers

We can apply the same approach to generate a list of random integers. To do this, we’ll create a list comprehension that calls the random.randint() function multiple times. Let’s see how we can create a list of 5 random integers between 50 and 100:

# Generate a list of random integers in Python
import random

random_list = [random.randint(50, 100) for i in range(5)]
print(random_list)

# Returns: [79, 66, 55, 69, 73]

Generate a List of Random Integers without Substitution

In this section, you’ll learn how to generate a list of random integers without substitution. This means that you can select a number once, and only once. In order to do this, you can use the random.sample() function.

The function expects a list of values and the number of values to select. So, say you wanted to select five values without substitution between 0 and 15, you could write:

# Generate a list of random integers without substitution
import random

random_list = random.sample(range(0, 16), k=5)
print(random_list)

# Returns: [2, 6, 14, 9, 12]

Generate a Random (Normal) Gaussian Distribution in Python

The random library also allows you to select a random value that follows a normal Gaussian distribution. In order to do this, you can use the gauss() function, which accepts both the mean and the standard deviation of the distribution.

Let’s see how you can generate a random value from a distribution with the mean of 10 and a standard deviation of 1:

# Selecting a random number from a Normal Distribution
import random

random_gaussian = random.gauss(10, 1)
print(random_gaussian)

# Returns: 10.202050547919738

Want to create an entire distribution? Check out this article here, which teaches you how to produce an entire Gaussian (Normal) distribution using Numpy.

The random library also comes with helpful ways to generate random numbers from other types of distributions. Check out the full list below:

  • Beta distribution: random.betavariate()
  • Exponential distribution: random.expovariate()
  • Gamma distribution: random.gammavariate()
  • Gaussian distribution: random.gauss()
  • Log normal distribution: random.lognormvariate()
  • Normal distribution: random.normalvariate()

Create Reproducible Random Numbers in Python

There will be many times when you want to generate a random number, but also want to be able to reproduce your result. This is where the random.seed() function come in. This allows you to set a seed that you can reproduce at any time.

Let’s see how we can do this:

# Creating results you can reproduce
import random

random.seed(100)
print(random.random())

# Returns: 0.1456692551041303

Let’s break this down a little bit:

  1. We imported the library
  2. We then instantiated a random seed, using the value of 100
  3. Then when we printed a random float, a value was returned
  4. If we were to run this again, the same value would be returned

Conclusion

In this tutorial, you learned how to generate random numbers using Python. You learned how the random library works to generate random numbers, including floats and integers. You also learned how to generate random numbers from different ranges of numbers, including only multiples of numbers.

You then learned how to generate lists of random numbers, including floats and integers, as well as without substitution. Finally, you learned how to select random numbers from a normal distribution and how to reproduce your results.

Additional Resources

To learn more about related topics, check out the tutorials below:

  • Python: Select Random Element from a List
  • Python: Shuffle a List (Randomize Python List Elements)
  • NumPy for Data Science in Python
  • Python Random: Official Documentation

#статьи

  • 28 янв 2021

  • 11

Случайность управляет миром, а вы будете управлять случайностью. С помощью Python, конечно.

 vlada_maestro / shutterstock

Цокто Жигмытов

Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.

Чтобы имитировать бросок кубика в игре или предсказать загруженность интернет-ресурса, нужны случайные числа.

Мы разобрали самые популярные вопросы о случайных числах в Python с собеседований. Чаще всего для ответа достаточно написать код и кратко его прокомментировать. Да пребудет с вами Великий Рандом!

  • Случайные числа — это последовательность чисел, которая подчиняется одному из законов распределения.
  • Главных распределений два: равномерное, с графиком в виде горизонтальной линии, и нормальное, с графиком-колоколом (его ещё называют гауссианой).

  • Основная Python-библиотека для генерации случайных чисел называется random.
  • Большинство случайных чисел в программировании — не случайные, а псевдослучайные.

Сложность: 1/3

Что нужно помнить: случайные числа — это математическое понятие, и их не следует путать с обыденными, произвольными числами. Случайное число в математике и программировании — это:

  • число из определённого диапазона,
  • у которого есть определённая вероятность выпадения.

Другими словами, существует закон или правило, которое называется «функцией распределения» или просто «распределением». И это самое распределение «раздаёт» каждому числу из диапазона определённую вероятность выпадения.

В качестве диапазона значений математикам и программистам привычнее всего использовать диапазон действительных чисел от 0 до 1, но это могут быть и целые числа от 1 до 6, как в игральном кубике, или от 100 до 1 000 000 — и так далее. Главное, что и распределение, и диапазон известны заранее, а само число нет.

Итого: случайные числа — это искусственно полученная последовательность чисел из определённого диапазона, которая подчиняется одному из законов распределения случайной величины.

Распределения бывают разные. Так, равномерное распределение — это когда любое значение из диапазона имеет одну и ту же вероятность выпадения (как у игрального кубика или монетки). Если же распределение, например, нормальное (гауссиана), то чаще выпадают числа из середины диапазона. Есть даже таблица — она поможет выбрать подходящее распределение.

Сложность: 1/3

Основных способов два: с помощью «родной» библиотеки random и с помощью модуля numpy.random из библиотеки numpy.

Прежде чем интервьюер придерётся, не забудьте сказать, что и random, и numpy.random — генераторы псевдослучайных чисел (о них ниже). Истинно случайные числа можно получить, например, c сайта Random.Org: там они генерируются с помощью атмосферного шума.

import random

# Случайное число между 0 и 1 (исключая 1)
random.random()

# Случайное число между 1 и 2, равномерное распределение
random.uniform(1,2)

# Случайное число, нормальное распределение
# 1 и 2 здесь уже не границы диапазона, а параметры mu и sygma
random.gauss(1,2) 

Библиотека random имеет меньший объём, чем numpy.random, и проще в использовании. Зато numpy.random содержит дополнительные распределения для научных вычислений, а также функции для генерирования целых массивов случайных данных.

from numpy.random import default_rng

rng = default_rng()

vals = rng.standard_normal(10)

В первой строчке мы импортировали default_rng — это «генератор генераторов» случайных массивов из модуля numpy.random. Во второй — создали экземпляр такого генератора и присвоили ему имя rng. В третьей использовали его метод standard_normal, чтобы получить numpy-массив из 10 случайных чисел, и записали массив в переменную vals.

Сложность: 3/3

Псевдослучайные числа — это, если очень упрощать, последовательность чисел, которая только выглядит случайной, а на самом деле каждое число в ней определяется алгоритмом, то есть вычисляется. Псевдослучайные последовательности цикличны: через какой-то период все числа повторяются в точности в том же порядке.

Библиотека random и модуль numpy.random содержат в себе генератор не истинно случайных, а именно псевдослучайных чисел.

Генерировать истинно случайные числа дорого и сложно. Основная трудность состоит в том, чтобы гарантировать отсутствие какого-либо цикла, правила или алгоритма. Чаще всего истинно случайные числа берут из физического мира: шумов атмосферы, детекторов частиц, колебаний электрического тока или из космического излучения.

То, что псевдослучайная последовательность, в отличие от истинно случайной, воспроизводима, очень удобно для практических задач: часто нужно подать на вход ту же самую последовательность второй раз, чтобы посмотреть, как работает программа после добавления новых фич.

Визуализация работы генератора псевдослучайных чисел. Видите какую-нибудь закономерность? А она есть.Источник

Наиболее популярный современный алгоритм генерирования псевдослучайных чисел разработан в 1997 году и носит красивое название «Вихрь Мерсенна». Он используется и в Python. Последовательность чисел, порождённая им, статистически неотличима от истинно случайной и имеет период, равный числу с шестью тысячами знаков. Этого хватает для задач симуляции и моделирования, но с точки зрения криптографии такая последовательность всё равно небезопасна: для успешной атаки достаточно иметь сравнительно небольшую сгенерированную этим генератором последовательность.

Сложность: 2/3

Истинно случайную последовательность повторить невозможно. Но для повторения псевдослучайных чисел в обеих основных библиотеках — random и numpy.random есть функция seed (), которая отвечает за инициализацию («посев») последовательности.

import random


random.seed(42)
print(random.random())  # 0.6394267984578837
print(random.random())  # 0.025010755222666936

random.seed(42)
print(random.random())  # 0.6394267984578837

Передавая аргумент 42 в функцию seed (), мы указываем конкретное место в псевдослучайной последовательности, поэтому команда random.random () в третьей и последней строках выдаёт одинаковое число — оно идёт первым после точки, помеченной как seed (42).

В seed () можно передать целые и дробные числа, а также строки и кортежи. Если оставить скобки пустыми, то в качестве аргумента seed () возьмёт текущее системное время.

Аналогичная функция есть в модуле numpy.random:

import numpy as np


np.random.seed(42)
print(np.random.rand())  # 0.3745401188473625
print(np.random.rand())  # 0.9507143064099162

np.random.seed(42)
print(np.random.rand())  # 0.3745401188473625

Сложность: 1/3

Часто на собеседованиях просят написать программу, связанную с вероятностями. Например, код для численной проверки ответа к задачке «Какова вероятность вытащить зелёный шар из мешка, в котором 1 зелёный и 4 красных шара».
(Ответ ⅕ = 0,2).

Иными словами, если 100 раз вынимать шар из мешка, возвращая его обратно, количество выпадения зелёных шаров должно приближаться к 20. Вариант кода для проверки:

import random


green_ball_count = 0  # счётчик зелёных шаров

for i in range(0,100):
    new_ball = random.choice(['green', 'red', 'red', 'red', 'red'])
    if new_ball == 'green':
        green_ball_count = green_ball_count + 1

print (green_ball_count)

Функция random.choice () случайным образом выбирает значение из заданного диапазона — списка из одного «green» и четырёх «red». Код выведет количество зелёных шаров после 100 попыток.

Сложность: 1/3

Другой вариант: предположим, у нас есть так называемая «нечестная» монетка, где орёл (H, «heads») и решка (T, «tails») выпадают не с вероятностью ½, как положено, а по-другому: орёл с вероятностью p (H) = 0,2, а решка, соответственно, p (T) = 0,8.

Тогда код для проверки будет выглядеть примерно так:

import random


H_count = 0
for i in range(0,10000):
    new_flip = random.choices(['H', 'T'], weights=[0.2, 0.8])
    if new_flip == ['H']:  # внимание: функция choices возвращает список!
        H_count = H_count + 1

print (H_count)

Здесь используется другая функция, choices, в которую вместе со списком значений можно в параметре weights передавать вероятности их выпадения.

Код выведет количество выпавших орлов после 10 000 бросков.

Сложность: 2/3

Закон больших чисел (ЗБЧ) говорит, что при увеличении количества попыток случайная величина стремится к своему математическому ожиданию — всё усредняется. Подробнее об этом можно прочитать в нашей статье об основах математики для Data Science.

Код для иллюстрации ЗБЧ на примере честной монетки выглядит так:

import random
import matplotlib.pyplot as plt


total_flips = 0
numerical_probability = []
H_count = 0

for i in range(0,5000):
    new_flip = random.choices(['H', 'T'], weights=[0.5, 0.5])
    total_flips = total_flips + 1
    if new_flip == ['H']: # внимание: функция choices возвращает список, а не строку ‘H’ или ‘T’!
         H_count = H_count + 1
         numerical_probability.append(H_count/total_flips)
         
# рисуем график
plt.plot(numerical_probability)
plt.xlabel("Количество бросков")
plt.ylabel("Численная вероятность")

Вначале мы импортировали уже знакомый нам модуль random и модуль matplotlib.plt — он нужен для рисования простых графиков. После этого определили переменные: общее количество бросков (total_flips), список из значений вероятностей (numerical_probability), количество выпавших орлов (H_count).

Теперь в цикле мы 5 000 раз «подбрасываем» монетку. Если выпадает орёл («H»), то делим текущее количество выпавших орлов на текущее количество бросков и добавляем итоговое значение в конец списка numerical_probability. В конце рисуем график.

Чем больше бросков, тем ближе к 0,5 вероятность выпадения орла. Всё, как и предсказывает закон больших чисел.

Сложность: 2/3

В логистике: при расчётах страховых запасов товара — чтобы склад внезапно не опустел или, наоборот, не пришлось держать избыток товара слишком долго. Принято считать, что поведение покупателей случайно и подчиняется одной из разновидностей нормального распределения. В особо запущенных случаях считается случайным даже поведение поставщиков.

В науке: с помощью метода Монте-Карло учёные моделируют поведение частиц во фрактальном окружении в трёхмерном пространстве. Метод Монте-Карло основан на использовании большого количества генерируемых случайных чисел.

В микроэлектронике: броуновское движение частиц играет важную роль в формировании пористости плёночного покрытия полупроводников при напылении его на поверхность. Просчитать это на компьютере гораздо дешевле, чем экспериментировать с реальным покрытием, поэтому сначала его рассчитывают, а потом запускают в производство.

В криптографии: для генерации шифровальных ключей. Здесь становится особенно важным различие между псевдослучайными и истинно случайными числами.

Так говорил мастер Угвэй, и мы теперь понимаем его чуть лучше: он жил довольно долго, мог заметить период повторения одних и тех же событий и догадаться, что все случайности в этом мире на самом деле псевдослучайны. У нас с вами времени меньше, поэтому придётся изучать документацию: random, numpy.random.

Учись бесплатно:
вебинары по программированию, маркетингу и дизайну.

Участвовать

Sometimes, in making programs for gaming or gambling, we come across the task of creating a list all with random numbers in Python. This task is to perform in general using loop and appending the random numbers one by one. But there is always a requirement to perform this in the most concise manner. Let’s discuss certain ways in which this can be done.

Random Number Using random module

Python Random module is an in-built module of Python which is used to generate random numbers. This module can be used to perform random actions such as generating random numbers, printing random a value for a list or string, etc.

Method 1: Using the random.randint()

By using random.randint() we can add random numbers into a list.

Python3

import random

rand_list=[]

n=10

for i in range(n):

    rand_list.append(random.randint(3,9))

print(rand_list)

Output

[9, 3, 3, 6, 8, 5, 4, 6, 3, 7]

Method 2: Using random.sample() 

This single utility function performs the exact required as asked by the problem statement, it generated N no. of random numbers in a list in the specified range and returns the required list.

Python3

import random

res = random.sample(range(1, 50), 7)

print ("Random number list is : " +  str(res))

Output

Random number list is : [49, 20, 23, 34, 6, 29, 35]

Method 3: Using list comprehension + randrange() 

The naive method to perform this particular task can be shortened using list comprehension. randrange function is used to perform the task of generating the random numbers. 

Python3

import random

res = [random.randrange(1, 50, 1) for i in range(7)]

print ("Random number list is : " +  str(res))

Output

Random number list is : [32, 16, 9, 28, 19, 31, 21]

Method 4: using loop + randint()

Python3

import random

lis = []

for _ in range(10):

    lis.append(random.randint(0, 51))

print(lis)

Output:

[3, 11, 48, 2, 48, 2, 8, 51, 8, 5]

Random Number Using Numpy

The random function provided by the Numpy module can be more useful for you as it provides little better functionality and performance as compared to the random module.

Method 1: Generating a list of random integers using numpy.random.randint function

This function returns random integers from the “discrete uniform” distribution of the integer data type.

Python3

import numpy as np

print(list(np.random.randint(low = 3,high=8,size=10)))

print(list(np.random.randint(low = 3,size=5)))

Output: 
[5, 3, 6, 7, 4, 5, 7, 7, 7, 7]
[0, 2, 1, 2, 1]

Method 2. Generating a list of random floating values using numpy.random.random_sample function

This function return random float values in half open interval [0.0, 1.0).

Python3

import numpy as np

print(np.random.random_sample(size = 4))

print(np.random.random_sample(size = (4,4)))

output:
[0.08035145 0.94966245 0.92860366 0.22102797]
[[0.02937499 0.50073572 0.58278742 0.02577903]
 [0.37892104 0.60267882 0.33774815 0.28425059]
 [0.57086088 0.07445422 0.86236614 0.33505317]
 [0.83514508 0.82818536 0.1917555  0.76293027]]

The benefit of using numpy.random over the random module of Python is that it provides a few extra probability distributions which can help in scientific research.

Понравилась статья? Поделить с друзьями:
  • Как написать генератор qr кодов
  • Как написать генеральную доверенность на машину
  • Как написать генеральную доверенность на квартиру
  • Как написать генеральную доверенность на все действия
  • Как написать генеральную доверенность на автомобиль