Python. Модуль random. Генерирование случайных чисел. Классы Random, System.Random Бухгалтерские функции. Функции для целых чисел

Модуль random. Генерирование случайных чисел. Классы Random, SystemRandom. Функции счетоводства. Функции для целых чисел


Содержание


1. Назначение и подключение модуля random. Категории обрабатываемых чисел

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

  • целые числа;
  • последовательности чисел;
  • вещественные числа (числа с плавающей запятой).

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

Чтобы использовать функции из модуля random предварительно нужно этот модуль подключить с помощью строки

import random

 

2. Классы Random и SystemRandom. Назначение

Для работы со случайными числами в модуле random можно выделить два основных скрытых класса:

  • класс Random;
  • класс SystemRandom.

Экземпляр класса Random обеспечивает все необходимые функции. Для получения генераторов, независимых от текущего состояния экземпляра класса Random, можно создать собственные экземпляры этого класса. Чтобы получить собственный генератор чисел, нужно переопределить методы класса Random: random(), seed(), getstate() и setstate().

Класс SystemRandom содержит системную функцию os.urandom(), которая генерирует случайные числа из источников предоставляемых операционной системой.

 

3. Функция random(). Пример

Все функции языка Python базируются на использовании функции random(), которая генерирует число с плавающей запятой в полуоткрытом диапазоне [0.0, 1.0].

Функция random() использует так называемый Вихрь Мерсенна (Mersenne Twister), который основан на свойствах простых чисел Мерсенна. Изучение данного способа генерирования случайных чисел можно найти в других источниках. Генератор выдает значение с точностью 53 знака и имеет период 2**19937-1.

Пример. В примере в переменную x записывается случайное число с помощью функции random()

# подключение модуля random
import random

# сгенерировать случайное число
x = random.random() # x = 0.016419749852326193


 

4. Функции счетоводства
4.1. Функция random.seed(). Пример

Функция random.seed() инициализирует генератор случайных чисел. Функция имеет следующую общую форму

random.seed(a = None, version = 2)

где

  • a – целочисленное значение, из которого нужно начинать генерирование случайных чисел. Если параметр a опущен, то используется текущее системное время. Системное время может быть получено из операционной системы с помощью функции os.urandom();
  • version – параметр, который может принимать одно из двух значений: version = 2 (по умолчанию) и version = 1. Если version = 2 (по умолчанию), то объект str, bytes или bytearray конвертируется в int, и используются все его биты. В режиме version = 1 предполагается использование последовательностей для более старших версий Python, и, поэтому алгоритм для типов str и bytes генерирует более узкий диапазон начальных чисел.

Пример.

# Функция random.seed() - инициализирует генератор случайных чисел
# подключение модуля random
import random

# Случай 1. Функция использует число 5 для генерирования последовательности
random.seed(5)
x = random.random() # x = 0.6229016948897019
y = random.random() # y = 0.7417869892607294

random.seed(5) # одни и те же числа что и в x, y - значения повторяются
z = random.random() # z = 0.6229016948897019
v = random.random() # v = 0.7417869892607294

# Случай 2. Функция использует системное время для генерирования последовательности
# Системное время постоянно изменяется
random.seed()
x = random.random() # x = 0.7662531463810477
y = random.random() # y = 0.9435964177952566

random.seed() # значение x, y, z, v разные
z = random.random() # z = 0.927815953637931
v = random.random() # v = 0.9508059701409717

В вышеприведенном коде наглядно продемонстрирована роль функции random.seed() в формировании последовательности случайных чисел на примере функции random().

Рассматриваются два случая использования функции random.seed():

  • с целочисленным параметром 5;
  • без параметра.

В первом случае функция два раза получает параметр 5

random.seed(5)

В результате последовательность случайных чисел повторяется. Значение переменных x, y такие же как и значения переменных z, v.

Во втором случае функция не использует параметра

random.seed()

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

 

4.2. Функции random.getstate() и random.setstate(). Пример

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

objName = random.getstate()

где objName – имя объекта.

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

random.setstate(objName)

где objName – имя объекта, в котором предварительно сохранено состояние генератора.

Пример

# Функции random.getstate(), random.setstate()
# подключение модуля random
import random

random.seed() # инициализировать генератор некоторым начальным значением
obj = random.getstate() # запомнить состояние в объекте obj
x = random.random() # получить случайное число

# инициализировать генератор другим начальным значением
random.seed() # получается новая последовательность случайных чисел

random.setstate(obj) # восстановить состояние из объекта obj
y = random.random() # получить предварительно сохраненное число

# вывести результат
print('x =', x)
print('y =', y)

Результат выполнения программы

x = 0.2056527930645382
y = 0.2056527930645382

Как видно из результата, значения x и y повторяются. Это значит, что с помощью вызова функции

random.setstate(obj)

можно восстановить последовательность случайных чисел (состояние), которое было предварительно сохранено в объекте obj с помощью вызова

obj = random.getstate()

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

random.seed() # получается новая последовательность случайных чисел

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

 

4.3. Функция random.getrandbits(). Пример

Функция random.getrandbits() возвращает целое число из диапазона, который формируется количеством бит. Общая форма функции

random.getrandbits(k)

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

Если k = 3, то получаются числа из диапазона 0..7 или (2**3-1). Если k = 8, то получаются число из диапазона 0..2**8-1 или 0..255.

Пример.

# Функция random.getrandbits()
# подключение модуля random
import random

# Случай 1. Количество бит = 4
print('Number of bits = 4')
i = 0
while i<10:
    x = random.getrandbits(4) # числа в диапазоне 0..2**4 => 0..15
    print(x, ' ')
    i=i+1

# Случай 2. Количество бит = 5
print('Number of bits = 5')
i = 0
while i<10:
    x = random.getrandbits(5) # числа в диапазоне 0..2**5 => 0..32
    print(x, ' ')
    i=i+1

Результат работы программы

Number of bits = 4
5
5
15
6
11
2
10
14
12
0
Number of bits = 5
4
9
4
18
28
19
5
29
17
31

 

5. Функции для целых чисел
5.1. Функция random.randrange(). Установление диапазона случайных значений

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

random.randrange(stop)
random.randrange(start, stop [, step])

где

  • stop – числовое целочисленное значение, определяющее наибольшее число, которое может быть сгенерировано (верхняя граница диапазона);
  • start – числовое целочисленное значение, определяющее наименьшее число, которое может быть сгенерировано (нижняя граница диапазона);
  • step – величина, которая устанавливает разность (шаг) между двумя соседними возможными значениями случайных чисел. То есть, случайные числа кратны значению step. Например, если step = 4, то случайные числа будут кратны 4: 8, 16, 40, 28…

Пример. В примере продемонстрирована работа функции random.randrange() для разного количества параметров.

# Функция random.randrange()
# подключение модуля random
import random

# Вариант 1. С двумя параметрами
# генерирование 5 случайных целых чисел в диапазоне [0, 19]
print('Function random.randrange(0,20)')
i=0
while i<5:
    d = random.randrange(0,20)
    print(d)
    i = i+1
print

# Вариант 2. С одним параметром
# генерирование 5 случайных целых чисел в диапазоне [0, 9]
print('Function random.randrange(10)')
i=0
while i<5:
    d = random.randrange(10) # random.randrange(9+1)
    print(d)
    i = i+1
print

# Вариант 3. С тремя параметрами
# генерируются числа кратные 3
print('Function random.randrange(0,20,3)')
i=0
while i<5:
    d = random.randrange(0,20,3)
    print(d)
    i = i+1

Результат выполнения программы

Function random.randrange(0,20)
6
7
18
9
7

Function random.randrange(10)
1
0
1
0
7

Function random.randrange(0,20,3)
6
3
0
12
15

 

5.2. Функция random.randint(). Получение целочисленного случайного числа

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

a <= N <= b

 

Пример.

# Функция random.randint()
# подключить модуль random
import random

# вывести 10 чисел в диапазоне [200..300]
i=0
while i<10:
    d = random.randint(200,301)
    print(d)
    i = i+1

Результат работы программы

231
281
286
211
250
200
256
232
203
242

 


Связанные темы