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

Создаем массив случайных чисел в Python: модуль random

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

Разработка списков так называемых случайных чисел — фундаментальная операция во многих областях программирования: от простых игр и моделирования до сложных статистических вычислений и машинного обучения. В языке Python существуют средства для решения таких задач. 

random – стандартный модуль Python для работы с числовыми массивами. Также он может генерировать псевдослучайные числа с разными распределениями. Сосредоточимся на создании массивов, изучим разные методы, функции, которые позволяют свободно управлять диапазоном, типом и объемом данных. Заодно объясним важные нюансы, связанные с воспроизводимостью результатов.

Что такое случайные числа и где они применяются?

Само это понятие уходит корнями в древность. Тогда случайные числа применялись для решения задач, а сейчас их роль расширилась. Сейчас они — часть современных научных исследований, нужная для многих задач: от проверки гипотез и статистического анализа до моделирования сложных систем. 

Перечислим, где они применяются:

  • в статистике — проверка гипотез, построение моделей; 
  • в физике и химии — моделирование сложных систем (например, молекулярного движения);
  • в биологии — моделирование эволюции и эпидемий;
  • в информатике — в основе алгоритмов оптимизации и машинного обучения;
  • в криптографии — создание ключей безопасности. 

Кроме того, методы Монте-Карло, использующие большие массивы числовых данных, применяются для решения сложных задач — вычисления интегралов или моделирования рынков.

Генерация массивов и их дальнейшее практическое использование дают ученым и ИТ-специалистам моделировать сложные явления, проводить анализ, создавать безопасные системы.

Псевдослучайные числа

В ИТ понятие случайного числа можно считать условным. Компьютеры всегда выполняют инструкции последовательно, поэтому создаваемые ими числовые данные — на самом деле псевдослучайные. Они генерируются по определенному алгоритму на основе установленного начального значения (seed). Качество конечных данных определяется тем, насколько хорошо они имитируют истинно случайные последовательности.

Для чего нужна генерация случайных чисел?

Перечислим, в каких отраслях, связанных с ИТ, применяются псевдослучайные числа:

  • в компьютерных играх — для создания рандомных событий в сюжете, поведения неигровых персонажей (NPC), непредсказуемых игровых миров;
  • в симуляции и моделировании — для создания реалистичных сценариев (поведение физических систем, финансовых рынков, распространение эпидемий);
  • в криптографии (шифрование);
  • в статическом анализе — для валидации моделей, создания тренировочных выборок, выполнения стохастических алгоритмов (методы Монте-Карло);
  • в науке — для статистических экспериментов, обработки данных, построения моделей;
  • в повседневных приложениях (онлайн-игры, реклама, автоматическая генерация паролей).

Качество последовательностей напрямую влияет на надежность и точность результатов в соответствующих областях.

Модуль random для создания случайных чисел в Python

Генератор псевдослучайных чисел в random использует семя (seed) — начальное числовое значение — для формирования числовой последовательности. Идентичное семя всегда дает одну и ту же последовательность.

Чтобы каждый запуск программы давал новую последовательность, используйте random.seed() с текущим временем в качестве аргумента. Если семя не вызывается, Python по умолчанию использует системное время.

Основная функция модуля random, random.random(), возвращает вещественное число от 0.0 до 1.0 (исключая 1.0). На ее основе построены другие функции:

  • random.randint(a, b) — генерирует целое число от a до b включительно;
  • random.choice(seq) — выбирает значение в пределах последовательности;
  • random.sample(population, k) — выбирает k разных элементов из population.

Модуль random также поддерживает разные распределения вероятностей:

  • random.uniform(a, b): равномерное в интервале [a, b);
  • random.gauss(mu, sigma): нормальное (гауссово) со средним mu и стандартным отклонением sigma.

Доступны и другие распределения (экспоненциальное, логарифмическое).

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

Создание множества случайных чисел в Python

Создавать случайные числовые последовательности в Python удобнее всего с помощью генераторов списков (list comprehensions) в сочетании с функциями модуля random. 

Например, список из 100 целочисленных значений от 1 до 1000 создается так:

random_numbers = [random.randint(1, 1000) for _ in range(100)]. 

Функция random.randint() генерирует каждое число, а цикл повторяет это 100 раз. Символ _  — фиктивная переменная.

Аналогично, для чисел с плавающей точкой от 0 до 1 (не включая 1) используется следующий алгоритм: floating_point_numbers = [random.uniform(0, 1) for _ in range(50)]. 

Размер списка можно легко менять, изменяя количество итераций в range().

Создание массива случайных чисел в Python

Массивы в Питоне проще всего создавать при помощи сочетания генераторов списков (list comprehensions) с функциями random. Этот подход сочетает краткость записи с высокой производительностью.

Например, для массива из 100 целочисленных значений от 1 до 10 (включительно) используется следующий код: my_array = [random.randint(1, 10) for _ in range(100)]. 

Функция random.randint(1, 10) генерирует каждое отдельное случайное число, а генератор списка повторяет этот процесс 100 раз, создавая массив необходимой длины. Символ _ здесь — заполнитель: значение счетчика цикла не используется.

Дополнительные функции позволяют создавать более сложные сценарии:

  • random.uniform(a, b) генерирует значения с плавающей точкой в интервале [a, b);
  • random.randrange(start, stop[, step]) позволяет задавать шаг для генерации числовых данных в диапазоне;
  • random.gauss(mu, sigma) создает ряды с гауссовым распределением, ограниченным средним значением mu и стандартным отклонением sigma.

Сочетание list comprehensions с функциями random — мощный и гибкий инструмент для генерации числовых массивов разного типа и с разными распределениями вероятностей.

Библиотека numpy для создания массивов случайных чисел в Python

Для работы с большими объемами числовых значений возможностей стандартного модуля random может оказаться недостаточно. Оптимизированные функции для генерации массивов псевдослучайных чисел содержатся в библиотеке NumPy. Она значительно ускоряет обработку. Это особенно актуально для больших датасетов и вычислений.

Например, функция numpy.random.randint(low, high, size) создает массив заданного размера (size) с целыми случайными числами в диапазоне от low до high (исключая high).

Аналогичные функции для вещественных чисел и разных распределений вероятностей позволяют генерировать массивы с разными характеристиками. Использование NumPy делает работу с псевдослучайными числами более производительной. Преимущества особенно заметны при создании многомерных массивов, особенно в машинном обучении и научных экспериментах.

Советы по использованию случайных чисел

Если вам нужна безопасность с точки зрения криптографии (например, для генерации ключей шифрования), модуль random не подходит. В таких случаях лучше модуль secrets. В нем есть функции для создания чисел, подходящих для криптографических применений — secrets.randbelow() и secrets.choice(). Они обеспечивают более высокую энтропию и безопасность, чем функции из random.

При выборе распределения стоит учитывать природу моделируемого явления:

  • равномерное распределение подходит для моделирования случайного выбора из равных вариантов;
  • нормальное распределение — для моделирования многих естественных явлений; 
  • экспоненциальное распределение — для моделирования времени ожидания событий. 

Неправильное использование массивов может привести к ошибкам в моделировании, неточным прогнозам или уязвимостям в криптографических приложениях. Поэтому всегда тщательно анализируйте требования к случайности, производительности и безопасности, прежде чем выбирать конкретный алгоритм и библиотеку.

Всегда обращайте внимание на диапазон генерируемых чисел. Убедитесь, что он соответствует требованиям вашей задачи. Неправильный диапазон может исказить результаты или привести к ошибкам. 

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

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