Случайные числа в NumPy. Вероятности и перетасовки

Создано: 04.12.2025

Для генерации случайных чисел, состоящих из них массивов, перетасовок и другого в NumPy есть свой модуль — random.

Функция randint этого модуля возвращает одно целое число или массив таковых. В простых вариантах ее использования можно задать только одну границу (нижняя будет от нуля), две, указать форму массива, тип данных.

import numpy as np

a = np.random.randint(2)  # 0 или 1. Верхняя граница не входит
print(a, type(a))

b = np.random.randint(-5, 10)
print(b)

c = np.random.randint(50, size=3, dtype='i2')
print(c, type(c), c.dtype)

d = np.random.randint(50, size=(2, 2, 5))
print(d, d.dtype)
1 <class 'int'>
-2
[34 29 23] <class 'numpy.ndarray'> int16
[[[ 7 42 45 14 13]
  [49 11 31 36 47]]

 [[48 30 21 48 20]
  [13 27 47  4  7]]] int64

В более сложных вариантах можно задать границы для каждого числа в массиве или для каждого вложенного массива.

import numpy as np

a = np.random.randint(1, [10, 100, 1000, 50])
print(a)

b = np.random.randint([-10, 0, 20], [0, 10, 100])
print(b)

c = np.random.randint([0, 1, 2], [[10], [100]])
print(c)
[  3  35 868  10]
[-10   5  79]
[[ 1  6  3]
 [86 83 50]]

Функция (метод) rand используется для генерации массивов вещественных чисел. Без аргументов выдает одно число в пределах [0, 1). Аргументы обозначают форму массива:

a = np.random.rand()
print(round(a, 2))

b = np.random.rand(3) * 2 + 5
print(b.round(2))

c = np.random.rand(2, 5)
print(c.round(2))
0.22
[5.67 5.92 6.75]
[[0.58 0.07 0.67 0.88 0.66]
 [0.39 0.8  0.85 0.31 0.15]]

Для создания массивов только из заданных значений используется метод choice:

a = np.random.choice(['x', 'y', 'z'], size=5)
print(a)

b = np.random.choice([96, 36, 72, 108], size=(2, 5))
print(b)
['x' 'z' 'y' 'z' 'y']
[[ 72 108  72  96  36]
 [ 36  72 108  36  96]]

Если в choice() передать только массив (список), будет возвращено одно любое значение из него.

a = np.linspace(0.1, 1, 10)
print(a)
print(np.random.choice(a))
[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]
0.8

С помощью метода choice() можно сгенерировать набор случайных значений, где каждое будет представлено с определенной вероятностью (встречаться с определенной частотой). При передаче аргументов в choice() вероятности помещаются в отдельный список и присваиваются параметру p. Количество указанных вероятностей должно совпадать с количеством различных вариантов значений в массиве, который будет получен.

Вероятности указываются как дробные числа от нуля до единицы, где 0 соответствует отсутствию значения, а 1 — значению, которое встречается в массиве всегда. Сумма вероятностей должна составлять ровно единицу, иначе возникает ошибка.

a = np.random.choice([3, 5, 7, 11], size=(4, 10),
                     p=[0.5, 0.25, 0.15, 0.1])

print(a)
unique, counts = np.unique(a, return_counts=True)
print(dict(zip(unique, counts)))
[[ 3  3  3  7  3  3 11  3  5  3]
 [ 3  7  3  3  3  5  3 11  7  5]
 [ 5  3 11  5  3  3  3  3  5  5]
 [ 3  3  7  3  5  7  3  3  5  3]]
{3: 23, 5: 9, 7: 5, 11: 3}

Представьте, что вам необходим массив со всеми числами в определенном диапазоне, каждое должно встречаться один раз, но располагаться числа должны не последовательно согласно своим значениям, а быть перемешанными. Или уже готовый массив надо перетасовать (permutation — перестановка) по-новому. В этом случае используются методы shuffle (действие происходит на месте) и permutation (создается новый массив).

a = np.arange(12).reshape(4, 3)
print(a)

np.random.shuffle(a)
print(a)

b = a.flatten()
print(b)

c = np.random.permutation(b).reshape(4, 3)
print(c)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
[[ 9 10 11]
 [ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]]
[ 9 10 11  0  1  2  3  4  5  6  7  8]
[[ 6  4  3]
 [ 9  5  0]
 [ 1  7 10]
 [11  8  2]]

В примере показано, что в многомерном массиве перетасовываются непосредственно вложенные массивы, а не их элементы. Чтобы перетасовать таковой полностью, сначала его надо разгладить (превратить в одномерный).