Нашли ошибку?
Скачать чистый
урок 1 из 4≈ 15 минупражнения: 0 из 4

Генератор случайных чисел

Случайные целые и дробные числа, случайный выбор из списка — и зачем генератору seed, чтобы «случайный» результат повторялся.

Python запустится при первом выполнении

Случайные числа нужны, чтобы моделировать: бросать кости, перемешивать участников, проверять идеи на придуманных данных. В NumPy их выдаёт генератор (generator). Его создают один раз функцией np.random.default_rng, а потом просят у него числа методами:

[ ]Генератор и первые числа
import numpy as np

rng = np.random.default_rng(0)
print(rng.integers(1, 11, size=5))
print(rng.random(3))
print(rng.integers(0, 100, size=(2, 4)))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[9 7 6 3 4]
[0.01652764 0.81327024 0.91275558]
[[ 4 50 60 97]
 [72 63 54 55]]
  • rng.integers(начало, конец, size=n) — n случайных целых от начало до конец (конец не входит — как у arange);
  • rng.random(n) — n дробных чисел от 0 (включительно) до 1 (не включая).

Параметр size можно задать и формой — size=(3, 4) даст таблицу случайных чисел.

Seed: повторяемая случайность

Число в скобках default_rng(42) — seed («зерно»): с какого места начинается последовательность. С одним и тем же seed генератор выдаёт одни и те же числа — при каждом запуске и на любом компьютере:

[ ]Одинаковый seed — одинаковые числа
a = np.random.default_rng(2025).integers(1, 100, size=5)
b = np.random.default_rng(2025).integers(1, 100, size=5)
print(a)
print(b)
print((a == b).all())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[45 99 99 38 95]
[45 99 99 38 95]
True
[ ]Упражнение 1Двадцать бросков кубика решено

Создайте генератор rng с seed 42 и сохраните в rolls 20 бросков игрального кубика — случайные целые от 1 до 6.

rng = ...
rolls = ...

Вопрос

Какие числа может вернуть rng.integers(1, 7)?

Доля и вероятность

С логическими масками из модуля 4 случайные числа сразу превращаются в оценки вероятностей: rng.random(n) < 0.3 — это n «событий», каждое происходит с вероятностью 0.3. Доля True будет близка к 0.3, и тем ближе, чем больше n:

[ ]Событие с вероятностью 0.3
rng = np.random.default_rng(1)
for n in [10, 100, 10000]:
    print(n, (rng.random(n) < 0.3).mean())
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
10 0.2
100 0.3
10000 0.2987
[ ]Упражнение 2Тысяча монеток решено

Создайте генератор с seed 3 и смоделируйте 1000 бросков монеты: сохраните в heads маску «выпал орёл» (вероятность 0.5), а в share — долю орлов.

rng = ...
heads = ...
share = ...

Случайный выбор: choice

rng.choice(варианты, size=n) выбирает n элементов из массива или списка. По умолчанию элементы могут повторяться — как при бросках кубика. replace=False запрещает повторы — как при вытягивании шаров из барабана:

[ ]choice с повторами и без
rng = np.random.default_rng(11)
print(rng.choice(["орёл", "решка"], size=6))
print(rng.choice(np.arange(1, 11), size=5, replace=False))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
['орёл' 'орёл' 'решка' 'орёл' 'решка' 'решка']
[ 2  1  5  4 10]
[ ]Упражнение 3Лотерея 6 из 49 решено

Создайте генератор с seed 7 и сохраните в ticket шесть разных чисел от 1 до 49, отсортированных по возрастанию.

rng = ...
ticket = ...

[ ]Упражнение 4Кто выступает первым решено

Создайте генератор с seed 5 и выберите из списка speakers одного человека — того, кто выступает первым. Сохраните имя в first.

speakers = ["Анна", "Иван", "Мария", "Олег"]
rng = ...
first = ...

Итоги

  • rng = np.random.default_rng(seed) — генератор; одинаковый seed — одинаковые числа.
  • rng.integers(a, b, size=n) — целые от a до b − 1; rng.random(n) — дробные от 0 до 1, не включая 1.
  • rng.random(n) < p — n событий с вероятностью p; доля True оценивает вероятность.
  • rng.choice(варианты, size=n, replace=False) — выбор без повторов.
  • Каждый вызов продвигает генератор; чтобы повторить результат, создайте его заново с тем же seed.

Подробнее в справочнике

Нашли ошибку?