Формирование случайных наборов данных средствами Python

Раздел: Python -> Random

Генерация массивов случайных чисел в Python

Основной и наиболее эффективный способ получения списка случайных чисел в чистом Python - использование генератора списков (list comprehension) в сочетании с функциями модуля random. Этот подход подходит для массивов любого размера, не требует внешних библиотек и легко читается.

import random

n = 10
# Массив случайных целых чисел от 1 до 100
int_array = [random.randint(1, 100) for _ in range(n)]
print(int_array)

массив случайных чисел python (генерация массива случайных чисел в python)

[42, 17, 89, 3, 66, 55, 91, 24, 78, 30]

Python случайный элемент массива (выбор случайного элемента из массива)

Аналогично для чисел с плавающей точкой (от 0 до 1):

float_array = [random.random() for _ in range(n)]
print(float_array)

Python random (генерация случайных чисел)

[0.3745, 0.8912, 0.0347, 0.6183, 0.2209, 0.7651, 0.4490, 0.1123, 0.9687, 0.5042]

Такой метод работает быстро даже для сотен тысяч элементов. При необходимости можно использовать random.uniform(a, b) для генерации чисел в произвольном диапазоне.

Возможная проблема: при большом размере массива (миллионы элементов) list comprehension может потреблять много памяти. В таких случаях предпочтительнее использовать numpy или генераторы (lazy evaluation).

Частая ошибка: импорт модуля random не полностью, а только функции (например, from random import randint) - это допустимо, но может привести к конфликтам имён.

Как получить массив неповторяющихся случайных чисел?

Для выборки без повторений используется random.sample(population, k). Она возвращает список из k уникальных элементов из заданной совокупности.

unique_numbers = random.sample(range(1, 101), 10)
print(unique_numbers)
[23, 56, 7, 91, 34, 12, 78, 45, 88, 3]

Цель: для лотерей, случайных индексов, тестовых данных без дубликатов.

Проблема: если k больше размера совокупности - возникнет исключение ValueError. Следует проверять длину популяции.

Типичная ошибка: передача изменяемого объекта (списка) без преобразования в неизменяемый - функция работает и с списками, но изменения в исходном списке приведут к неожиданному поведению.

Как сгенерировать массив случайных чисел с повторениями и управляемой вероятностью?

random.choices(population, weights=None, k) позволяет задать веса для каждого элемента. Элементы могут повторяться.

weighted = random.choices(['red', 'green', 'blue'], weights=[0.5, 0.3, 0.2], k=10)
print(weighted)
['red', 'blue', 'red', 'green', 'red', 'red', 'green', 'blue', 'red', 'green']

Цель: моделирование событий с разной вероятностью, генерация тестовых данных для A/B тестов.

Проблема: веса не нормируются автоматически. Если сумма весов не равна 1, поведение не определено - лучше передавать относительные значения.

Как получить большой массив случайных чисел быстро (с помощью NumPy)?

Библиотека numpy предоставляет функции numpy.random, оптимизированные для работы с массивами.

import numpy as np

n = 1000000
arr_int = np.random.randint(0, 100, size=n)
arr_float = np.random.random(n)
print(arr_int[:5], arr_float[:5])
[82 37 14 93 56] [0.8394 0.2918 0.0172 0.5501 0.4336]

NumPy намного быстрее чистого Python для больших массивов благодаря векторизации и использованию C/Fortran.

Проблема: требуется установка пакета (pip install numpy). Для маленьких массивов (десятки элементов) накладные расходы могут перевесить выигрыш в скорости.

Типичная ошибка: смешивание функций np.random.seed с глобальным seed модуля random - они независимы.

Как получить криптографически стойкие случайные числа?

Для нужд безопасности используется модуль secrets. Он предоставляет функции, устойчивые к предсказанию.

import secrets

# Случайное целое в диапазоне
secure_int = [secrets.randbelow(100) for _ in range(5)]
# Случайное число с плавающей точкой (0..1)
secure_float = [secrets.SystemRandom().random() for _ in range(5)]
print(secure_int, secure_float, sep='\n')
[57, 98, 11, 43, 76]
[0.0381, 0.9214, 0.4479, 0.5120, 0.2937]

Цель: генерация токенов, паролей, ключей шифрования.

Проблема: модуль secrets медленнее random. Его используют только там, где важна безопасность.

Как перемешать существующий список и получить случайную перестановку?

random.shuffle(x) изменяет исходный список на месте. random.sample(x, len(x)) возвращает новую перестановку.

original = [1, 2, 3, 4, 5]
shuffled = random.sample(original, len(original))
print(shuffled)
random.shuffle(original)
print(original)
[3, 1, 5, 2, 4]
[4, 2, 5, 3, 1]

Цель: случайное упорядочивание данных, жеребьёвка.

Проблема: shuffle не возвращает новый список, а модифицирует переданный. Это может быть неожиданным, если планируется сохранить оригинал.

Подробные примеры с кодом и результатами

Пример 1. Генерация матрицы случайных чисел

Пример
import random

rows, cols = 3, 4
matrix = [[random.randint(0, 9) for _ in range(cols)] for _ in range(rows)]
print("Матрица 3x4:")
for row in matrix:
    print(row)
Матрица 3x4:
[7, 2, 9, 1]
[4, 0, 5, 6]
[8, 3, 2, 7]

Пример 2. Использование seed для воспроизводимости

Пример
import random

random.seed(42)
array1 = [random.randint(1, 100) for _ in range(5)]
print("Первый вызов:", array1)

random.seed(42)  # сброс seed
array2 = [random.randint(1, 100) for _ in range(5)]
print("Второй вызов с тем же seed:", array2)
Первый вызов: [82, 15, 4, 95, 36]
Второй вызов с тем же seed: [82, 15, 4, 95, 36]

Позволяет получать одинаковые последовательности для отладки.

Пример 3. Случайные числа из нормального распределения (NumPy)

Пример
import numpy as np

normal_sample = np.random.normal(loc=0.0, scale=1.0, size=5)
print("Нормальное распределение:", normal_sample)
Нормальное распределение: [ 0.4967 -1.3852  0.4177 -0.6474  1.0123]

Пример 4. Генерация случайной строки из букв и цифр

Пример
import secrets
import string

alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for _ in range(12))
print("Случайный пароль:", password)
Случайный пароль: 'aK7dF2pX9qRw'

Пример 5. Выборка случайных элементов с заменой и без (сравнение)

Пример
import random

pool = list(range(10))
# с заменой
with_replacement = random.choices(pool, k=10)
# без замены
without_replacement = random.sample(pool, k=10)
print("С заменой:", with_replacement)
print("Без замены:", without_replacement)
С заменой: [3, 7, 3, 1, 9, 2, 7, 0, 5, 8]
Без замены: [4, 8, 1, 9, 3, 6, 0, 2, 5, 7]

В первом случае возможны повторы, во втором - все числа уникальны.

Пример 6. Генерация массива с заданным распределением (экспоненциальное)

Пример
import numpy as np

exp_data = np.random.exponential(scale=2.0, size=5)
print("Экспоненциальное распределение:", exp_data)
Экспоненциальное распределение: [1.3245 0.2134 3.8761 0.9532 2.4310]

Пример 7. Перемешивание многомерного массива (numpy)

Пример
import numpy as np

arr = np.arange(12).reshape(3, 4)
print("Исходный массив:")
print(arr)
np.random.shuffle(arr)  # перемешиваются строки
print("После shuffle по строкам:")
print(arr)
Исходный массив:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
После shuffle по строкам:
[[ 4  5  6  7]
 [ 8  9 10 11]
 [ 0  1  2  3]]

Генерация массива случайных чисел в Python - comments

En
массив случайных чисел python (python)