Модуль random, випадкові числа в Python
Генерація випадкових розподілів та псевдовипадкових чисел
Модуль random реалізує генератори псевдовипадкових чисел для різних розподілів.
Для цілих чисел існує рівномірний вибір діапазону. Для послідовностей існує рівномірний вибір випадкового елемента, функція для створення випадкової перестановки списку на місці і функція для випадкової вибірки без заміни.
На реальній лінії є функції для обчислення рівномірного, нормального (гаусівського), логнормального, негативного експоненціального, гамма та бета-розподілів. Для генерації розподілів кутів є розподіл фон Мізеса.
Майже всі функції модуля залежать від базової функції random.random() , яка генерує випадкове число з плаваючою точкою в напіввідкритому діапазоні [0.0, 1.0]. Python використовує Mersenne Twister як генератор ядра. Він генерує 53-бітові значення точності і має період 2**19937-1. Базова реалізація C є швидкою і потоково-орієнтованою. Mersenne Twister є одним із найбільш ретельно протестованих генераторів випадкових чисел із існуючих. Однак, будучи повністю детермінованим, він не підходить для всіх цілей і не підходить для криптографічних цілей.
Функції, що надаються цим модулем, насправді є пов'язаними методами прихованого екземпляра класу random.Random. Ви можете створити власні екземпляри Random() , щоб отримати генератори, які не діляться станом.
Клас Random() також можна розділити на підкласи, якщо ви хочете використовувати інший базовий генератор вашого власного пристрою: у цьому випадку перевизначте методи random.random() , random.seed() , random.getstate() та random.setstate() . При бажанні новий генератор може надати метод random.getrandbits() - це дозволяє random.randrange() вибирати вибірки в довільно великому діапазоні.
Модуль random також надає клас random.SystemRandom , який використовує системну функцію os.urandom() для створення випадкових чисел з джерел, що надаються операційною системою.
Попередження.
Псевдовипадкові генератори цього модуля не повинні використовуватися з метою безпеки. З метою безпеки чи криптографічного використання дивіться "Модуль secrets".
Зауваження щодо відтворюваності послідовностей.
Іноді корисно мати можливість відтворити послідовності, задані генератором псевдовипадкових чисел. При повторному використанні початкового значення seed , та сама послідовність повинна відтворюватися від запуску до запуску, поки не запущено кілька потоків.
Більшість алгоритмів і функцій модуля можуть змінюватись у різних версіях Python, але два аспекти гарантовано не зміняться:
- Якщо буде додано новий метод, то обов'язково буде запропоновано зворотну сумісність.
- Метод генератора random() буде продовжувати створювати ту ж послідовність, якщо сумісному методу буде дано те саме початкове число seed .
Приклади використання модуля random.
Базове застосування модуля:
>>>
import
random
# Випадкове float: 0.0 >>>
random.random()
# 0.37444887175646646
# Випадкове float: 2.5 >>>
random.uniform(2.5,
10.0)
# 3.1800146073117523
# Інтервал між прибуттям у середньому 5 секунд
>>>
random.expovariate(1
/
5)
# 5.148957571865031
# Цінне ціле число від 0 до 100 включно
>>>
random.randrange(10)
# 7
# Even integer from 0 to 100 inclusive
>>>
random.randrange(0,
101,
2)
26
# Один випадковий елемент із послідовності
>>>
random.choice(['win',
'lose',
'draw'])
'draw'
>>>
deck
=
'ace two three four'.split()
# Перемішати список
>>>
random.shuffle(deck)
>>>
deck
['four',
'two',
'ace',
'three']
# Чотири зразки без заміни
>>>
random.sample([10,
20,
30,
40,
50],
k=4)
# [40, 10, 50, 30]
# Шість обертів колеса рулетки (зважена вибірка із заміною)
>>>
choices(['red',
'black',
'green'],
[18,
18,
2],
k=6)
# ['red', 'green', 'black', 'black', 'red', 'black']
# Здайте 20 карт без заміни з колоди з 52 гральних карт
# і визначте пропорцію карт з гідністю:
десять, валет, дама або король.
>>>
dealt
=
sample(['tens',
'low cards'],
counts=[16,
36],
k=20)
>>>
dealt.count('tens')
/
20
# 0.15
# Оцінка ймовірності отримання 5 або більше влучень з 7
кидань монети, яка випадає орлом у 60% випадків.
>>>
def
trial():
.
return
choices('HT',
cum_weights=(0.60,
1.00),
k=7).count('H')
>=
5
.
>>>
sum(trial()
for
i
in
range(10_000))
/
10_000
# 0.4169
>>>
# Імовірність того, що медіана з 5 вибірок перебуває у середніх двох квартилях
>>>
def
trial():
.
return
2_500
sorted(choices(range(10_000),
k=5))[2]
7_500
.
>>>
sum(trial()
for
i
in
range(10_000))
/
10_000
# 0.7958
Приклад статистичного початкового завантаження з використанням повторної вибірки із заміною для оцінки довірчого інтервалу для середнього значення вибірки:
# http://statistics.about.com/od/Applications/a/Example-Of-Bootstrapping.htm
from
statistics
import
fmean
as
mean
from
random
import
choices
data
=
[41,
50,
29,
37,
81,
30,
73,
63,
20,
35,
68,
22,
60,
31,
95]
means
=
sorted(mean(choices(data,
k=len(data)))
for
i
in
range(100))
print(f'The sample mean of
mean(data):.1f>
has a 90% confidence '
f'interval from
means[5]:.1f>
to
means[94]:.1f>')
Приклад тесту перестановки повторної вибірки для визначення статистичної значущості або Р-значення різниці між ефектами препарату і плацебо:
# Example from "Statistics is Easy" by Dennis Shasha and Manda Wilson
from
statistics
import
fmean
as
mean
from
random
import
shuffle
drug
=
[54,
73,
53,
70,
73,
68,
52,
65,
65]
placebo
=
[54,
51,
58,
44,
55,
52,
42,
47,
58,
46]
observed_diff
=
mean(drug)
-
mean(placebo)
n
=
10_000
count
=
0
combined
=
drug
+
placebo
for
i
in
range(n):
shuffle(combined)
new_diff
=
mean(combined[:len(drug)])
-
mean(combined[len(drug):])
count
+=
(new_diff
>=
observed_diff)
print(f'n>
label reshufflings produced only
count>
instances with a difference')
print(f'at least as extreme as the observed difference of
observed_diff:.1f>.')
print(f'The one-sided p-value of
count
/
n:.4f>
leads us to reject the null')
print(f'Hypothesis that there is no difference між drug and the placebo.')
Моделювання часу прибуття та доставки послуг для багатосерверної черги:
from
heapq
import
heappush,
heappop
from
random
import
expovariate,
gauss
from
statistics
import
mean,
median,
stdev
average_arrival_interval
=
5.6
average_service_time
=
15.0
stdev_service_time
=
3.5
num_servers
=
3
waits
=
[]
arrival_time
=
0.0
servers
=
[0.0]
*
num_servers
# time when each server becomes available
for
i
in
range(100_000):
arrival_time
+=
expovariate(1.0
/
average_arrival_interval)
next_server_available
=
heappop(servers)
wait
=
max(0.0,
next_server_available
-
arrival_time)
waits.append(wait)
service_duration
=
gauss(average_service_time,
stdev_service_time)
service_completed
=
arrival_time
+
wait
+
service_duration
heappush(servers,
service_completed)
print(f'Mean wait:
mean(waits):.1f>. Stdev wait:
stdev(waits):.1f>.')
print(f'Median wait:
median(waits):.1f>. Max wait:
max(waits):.1f>.')
- КОРОТКИЙ ОГЛЯД МАТЕРІАЛУ.
- Генерація випадкового цілого числа чи байтів
- Генерація випадкових дійсних чисел
- Функція choice() модуля вибирає випадковий елемент
- Функція random.choices() вибирає кілька випадкових елементів
- Функція shuffle() модуля random перемішує список
- Функція random.sample() модуля random
- Ініціалізація та стан генератора
- Класи Random() та SystemRandom() модуля random
- Імовірнісні розподіли у модулі random Python
- Рецепти використання модуля random
- Функція binomialvariate() модуля random
- Модуль random може бути запущений з командного рядка
Модуль Random для генерації випадкових чисел у Python
Цей модуль реалізує генератори псевдовипадкових чисел під різні потреби.
- Для цілих чисел є вибір одного діапазону.
- Для послідовностей – вибір випадкового елемента, функція випадкового сортування списку та функція випадкового вибору кількох елементів із послідовності.
- Є функції для обчислення однорідних, нормальних (гаусівських), логнормальних, негативних експоненціальних, гама та бета розподілів.
- Для генерації розподілів кутів є розподіл фон Мізеса.
Майже всі функції модуля залежать від основної функції random() , яка генерує випадково чисто з плаваючою точкою (далі float) рівномірно у напіввідкритому діапазоні [0.0, 1.0).
Python використовує Mersenne Twister як основний генератор. Він виготовляє 53-бітові точні float і має період 2**19937-1. Основна його реалізація C швидка і багатопоточна. Mersenne Twister один із найбільш широко протестованих генераторів випадкових чисел. Однак, будучи повністю детермінованим, він підходить не для будь-яких цілей, особливо криптографічних.
Модуль random також надає клас SystemRandom. Цей клас використовує системну функцію os.urandom() для генерації випадкових чисел із джерел, які надає операційна система.
Псевдовипадкові генератори цього модуля не повинні використовуватися з метою безпеки. Для забезпечення безпеки або криптографічного використання ознайомтеся з модулем secrets.
Функції для цілих чисел
random.randrange(stop)
random.randrange(start, stop[, step])
Повертає випадково вибраний елемент із range(start, stop, step) . Це еквівалентно choice (range (start, stop, step)), але не створює об'єкт діапазону.