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