Коротко
- Создайте генератор:
rng = np.random.default_rng(seed), и берите числа из его методов. - Один и тот же
seedдаёт одну и ту же последовательность — так результаты воспроизводимы. Без seed — каждый запуск разный. integers(low, high, size)— целые,highне входит;random— [0, 1);uniform,normal— распределения.choice— случайный выбор (с повторами или без, с вероятностямиp);permutationвозвращает перемешанную копию,shuffleперемешивает на месте.- Функции вида
np.random.rand,np.random.seed— старый API. Он работает, но в новом коде используют генератор.
Синтаксис
rng = np.random.default_rng(42)
rng.integers(low, high=None, size=None)
rng.random(size=None)
rng.uniform(low=0.0, high=1.0, size=None)
rng.normal(loc=0.0, scale=1.0, size=None)
rng.choice(a, size=None, replace=True, p=None)
rng.permutation(x), rng.shuffle(x)Параметры
ПараметрЧто делаетПо умолчанию
seedчисло для воспроизводимости; None — случайное начальное состояниеNonesizeсколько чисел: число или форма массива; None — одно числоNonelow, highграницы; high не входит (у integers — если не передать endpoint=True)обязательныйloc, scaleсреднее и стандартное отклонение нормального распределения0.0, 1.0replaceв choice: можно ли выбирать один элемент несколько разTruepв choice: вероятности элементов, сумма 1NoneПримеры
rng = np.random.default_rng(42) # генератор с фиксированным seedprint(rng.integers(1, 7, size=10)) # кубик: 1–6, верхняя граница не входит
rng.integers(0, 100, size=(2, 3))Вывод
[1 5 4 3 3 6 1 5 2 1]
array([[52, 97, 73],
[76, 71, 78]])print(rng.random(3)) # равномерно на [0, 1)
print(rng.uniform(10, 20, size=3)) # равномерно на [10, 20)
rng.normal(loc=170, scale=8, size=4).round(1) # рост: среднее 170, отклонение 8Вывод
[0.77395605 0.43887844 0.85859792] [16.97368029 10.94177348 19.75622352] array([171. , 167.5, 169.9, 163.2])
colors = np.array(["красный", "синий", "зелёный"])
print(rng.choice(colors, size=5)) # с повторами
print(rng.choice(10, size=3, replace=False)) # без повторов
rng.choice(colors, size=5, p=[0.7, 0.2, 0.1]) # с вероятностямиВывод
['красный' 'зелёный' 'синий' 'синий' 'синий'] [0 9 6] array(['зелёный', 'синий', 'синий', 'красный', 'красный'], dtype='<U7')
cards = np.arange(6)
print(rng.permutation(cards)) # новый перемешанный массив
rng.shuffle(cards) # перемешать на месте
cardsВывод
[3 2 5 4 1 0] array([2, 4, 0, 1, 3, 5])
a = np.random.default_rng(7).integers(0, 100, size=4)
b = np.random.default_rng(7).integers(0, 100, size=4)
a, b # тот же seed — те же числаВывод
(array([94, 62, 68, 89]), array([94, 62, 68, 89]))
Подводные камни
Генератор с тем же seed в цикле
Если создавать генератор заново на каждой итерации с одним seed, каждый раз получится одно и то же число. Создайте генератор один раз до цикла.
for _ in range(3):
print(np.random.default_rng(1).integers(0, 100)) # новый генератор с тем же seed — одно и то жеВывод
47 47 47
Старый API np.random.*
Числа при одинаковом seed у старого и нового API разные — при переписывании старого кода результаты изменятся.
np.random.seed(42)
print(np.random.rand(3)) # старый API: работает, но числа другие
np.random.default_rng(42).random(3)Вывод
[0.37454012 0.95071431 0.73199394] array([0.77395605, 0.43887844, 0.85859792])