Создание списка случайных значений на языке Python

Раздел: Алгоритмы -> Случайные числа

Основной метод: генерация списка случайных целых чисел

Самым распространённым способом получения списка случайных чисел является использование модуля random в сочетании с генератором списков. Этот подход подходит для большинства задач, где требуется небольшое количество целых чисел из заданного диапазона.

import random
# Генерация 10 случайных целых чисел от 1 до 100
numbers = [random.randint(1, 100) for _ in range(10)]
print(numbers)

Python случайное число в диапазоне (генерация случайного числа в заданном диапазоне в python)

В результате получается список из десяти чисел, каждое из которых независимо выбирается равновероятно из диапазона 1..100. Функция randint возвращает целое число, включая правую границу. Если необходимо получить список вещественных чисел, можно использовать random.random или random.uniform.

# Список из 5 вещественных чисел от 0 до 1
floats = [random.random() for _ in range(5)]
print(floats)

Python список случайных чисел (генерация списка случайных чисел в python)

Для воспроизводимости результатов перед генерацией следует установить начальное значение генератора:

random.seed(42)
numbers = [random.randint(0, 9) for _ in range(5)]
print(numbers)  # всегда один и тот же набор

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

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

Для получения уникальных значений из диапазона без повторений применяется функция random.sample. Она выбирает заданное количество неповторяющихся элементов из указанной последовательности.

unique = random.sample(range(1, 50), 10)  # 10 чисел от 1 до 49 без повторов
print(unique)

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

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

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

Функция random.choices позволяет извлекать элементы из списка с возможностью повторений и с заданными весами. Это удобно для симуляции случайного выбора из набора с разной вероятностью.

options = ['red', 'green', 'blue']
weights = [0.5, 0.3, 0.2]  # вероятности
sample = random.choices(options, weights=weights, k=10)
print(sample)  # 10 цветов с учётом весов

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

Библиотека numpy предоставляет векторизованные функции, которые значительно ускоряют генерацию массивов случайных чисел, особенно при больших размерах.

import numpy as np
# Массив из 1000 чисел с нормальным распределением
arr = np.random.normal(loc=0, scale=1, size=1000)
print(arr[:5])  # первые 5 элементов

NumPy поддерживает множество распределений: равномерное (np.random.uniform), биномиальное (np.random.binomial), Пуассона (np.random.poisson) и другие.

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

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

import secrets
# Список из 5 случайных чисел от 0 до 255
secure_numbers = [secrets.randbelow(256) for _ in range(5)]
print(secure_numbers)

Модуль secrets не поддерживает генерацию списка напрямую, поэтому используется генератор списков.

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

Для имитации реальных процессов часто нужны числа, распределённые по нормальному, экспоненциальному или другому закону. В модуле random есть соответствующие функции.

# Нормальное распределение (среднее=0, стд.откл.=1)
normal = [random.gauss(0, 1) for _ in range(10)]
print(normal)
# Экспоненциальное распределение
exponential = [random.expovariate(1.0) for _ in range(10)]
print(exponential)

Для более сложных распределений можно использовать NumPy.

Типичные ошибки и их устранение

  • Ошибка импорта: написание import radnom вместо import random приводит к ModuleNotFoundError. Следует внимательно проверять имя модуля.
  • Путаница с границами: random.randint(a, b) включает обе границы, а random.randrange(a, b) не включает b. Использование неверной функции может дать неожиданный диапазон.
  • Повторение чисел при необходимости уникальности: применение генератора списков с random.randint не гарантирует уникальности. Для неповторяющихся значений нужен random.sample или random.shuffle предварительно подготовленного списка.
  • Проблема производительности: генерация миллионов чисел через list comprehension с random медленнее, чем использование NumPy. Для больших объёмов данных стоит перейти на numpy.random.
  • Неустойчивость результатов: если не задан seed, каждый запуск даёт разные числа. Для отладки или демонстрации начальное значение следует устанавливать явно.

Расширенные примеры генерации списков случайных чисел

Помимо базовых приёмов существуют специализированные решения для конкретных задач.

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

Создание двумерного списка (матрицы) размером M x N с помощью вложенного спискового включения:

Пример
import random
M, N = 3, 4
matrix = [[random.randint(0, 9) for _ in range(N)] for _ in range(M)]
print(matrix)
[[3, 7, 1, 8], [0, 5, 2, 9], [4, 6, 1, 3]]

Случайная перестановка существующего списка

Функция random.shuffle изменяет список на месте. Чтобы сохранить оригинал, копия создаётся до перемешивания.

Пример
original = list(range(1, 11))
shuffled = original[:]
random.shuffle(shuffled)
print('Original:', original)
print('Shuffled:', shuffled)
Original: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Shuffled: [8, 2, 10, 4, 7, 1, 9, 3, 5, 6]

Генерация случайных дат

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

Пример
import random
from datetime import datetime, timedelta
start = datetime(2020, 1, 1)
end = datetime(2023, 12, 31)
delta = end - start
random_dates = [start + timedelta(days=random.randint(0, delta.days)) for _ in range(5)]
print([d.strftime('%Y-%m-%d') for d in random_dates])
['2021-05-12', '2023-11-02', '2020-09-25', '2022-07-18', '2022-01-30']

Выборка случайных элементов с удалением из списка

Иногда нужно последовательно извлекать случайные элементы, удаляя их из исходного списка. Это реализуется через цикл с random.choice и remove, но эффективнее использовать random.shuffle и затем брать элементы по порядку.

Пример
deck = list(range(1, 53))
random.shuffle(deck)
drawn = [deck.pop() for _ in range(5)]  # извлекаем 5 карт
print('Drawn:', drawn)
print('Remaining:', len(deck))
Drawn: [47, 12, 31, 5, 28]
Remaining: 47

Параллельная генерация с помощью нескольких генераторов

Для воспроизводимости вычислений можно использовать random.Random - отдельный экземпляр генератора с собственным состоянием.

Пример
rng1 = random.Random(42)
rng2 = random.Random(42)
list1 = [rng1.randint(1, 10) for _ in range(3)]
list2 = [rng2.randint(1, 10) for _ in range(3)]
print(list1, list2)  # одинаковые последовательности
[2, 8, 1] [2, 8, 1]

Генерация списка случайных байтов

Для бинарных данных можно использовать secrets.token_bytes или random.randbytes (Python 3.9+).

Пример
import random
# 10 случайных байт (каждый 0-255)
bytes_list = list(random.randbytes(10))
print(bytes_list)
[205, 76, 13, 240, 64, 150, 32, 180, 85, 23]

Случайные числа с плавающей точкой из произвольного диапазона

Функция random.uniform генерирует равномерно распределённые вещественные числа, включая левую границу, правая может не включаться из-за округления.

Пример
floats = [random.uniform(10.5, 20.5) for _ in range(5)]
print([round(f, 2) for f in floats])
[14.87, 19.01, 11.34, 17.72, 12.66]

Создание генератора (не списка) для поточной обработки

Для экономии памяти при работе с большими последовательностями используется функция-генератор.

Пример
def random_gen(n, low, high):
    for _ in range(n):
        yield random.randint(low, high)

for num in random_gen(5, 1, 100):
    print(num, end=' ')
54 12 87 33 66

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

En
Python список случайных чисел (python)