Модуль random. Генерування випадкових чисел. Класи Random, SystemRandom. Функції рахівництва. Функції для цілих чисел
Зміст
- 1. Призначення та підключення модуля random. Категорії чисел, що обробляються
- 2. Класи Random та SystemRandom. Призначення
- 3. Функція random(). Приклад
- 4. Функції рахівництва
- 5. Функції для цілих чисел
- Зв’язані теми
Пошук на інших ресурсах:
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], тобто
a <= N <= b
Приклад.
# Функція random.randint() # підключити модуль random import random # вивести 10 чисел в діапазоні [200..300] i=0 while i<10: d = random.randint(200,300) print(d) i = i+1
Результат роботи програми
231 281 286 211 250 200 256 232 203 242
⇑
Зв’язані теми
⇑