Случайные числа в Python

Случайные числа в Python
На чтение
179 мин.
Просмотров
17
Дата обновления
09.03.2025
#COURSE##INNER#

Случайные числа в Python

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

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

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

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

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

Случайные числа - в компьютерной симуляции их нельзя назвать таковыми. Рождение цифр подчиняется определённым закономерностям детерминистического алгоритма.

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

Исходный номер последовательности - сид - определяет все остальные номера. Если известен сид, можно восстановить всю последовательность.

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

## Модуль random: Краеугольный Камень

Вас приветствует модуль random – основа для создания элементов случайности в Ваших программах.

Одно из базовых понятий при работе с random – это генератор случайных чисел. Он выдает потоки, казалось бы, случайных величин.

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

### Функции Случайных Чисел

Душой модуля выступают функции random(), randrange(), randint(), uniform(), и choice().

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

Например, random() вычисляет случайную точку с плавающей запятой в интервале [0;1), а randint() возвращает целые числа из заданного диапазона.

Следующая таблица суммирует функциональность основных функций генерации случайных чисел:

| Функция | Диапазон | Тип |

|---|---|---|

| random() | [0;1) | float |

| randrange() | [начало, конец) | int |

| randint() | [начало, конец] | int |

| uniform() | [начало, конец) | float |

| choice() | Список, Кортеж | Объект |

Непредсказуемость Задана!

Непредсказуемость Задана!

Здесь вы откроете тайны генерации непредсказуемых значений в Python!

Функция random() выступает в роли генератора случайных чисел с плавающей запятой в диапазоне [0, 1), тогда как ее собрат, randrange(), предпочитает работать с целыми числами. Представляя минимальное и максимальное значения, можно задать границы для генерируемых значений.

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

Константы MININT и MAXINT

В Python существуют две полезные константы для работы с целыми числами:

  • MININT
  • - представляет наименьшее возможное целочисленное значение.

  • MAXINT
  • - соответственно, наибольшее.

    Стоит отметить, что эти константы носят системно-зависимый характер.

    Значение MININT можно получить путем взятия минус бесконечности и применения операции отрицания.

    Для MAXINT воспользуйтесь функцией sys.maxsize, которая вернет целое число, аналогичное по значению для данной системы.

    Генерация Вещественных Случайностей

    Функция uniform генерирует числа в заданном диапазоне с равномерным распределением.

    random позволяет задать произвольное распределение с помощью функции expovariate, а функция normalvariate моделирует нормальное распределение.

    Кроме того, random предоставляет множество других распределений, таких как гамма, хи-квадрат и многое другое.

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

    Метод choice() для избирательного отбора из массива

    Метод choice() из арсенала модуля random обеспечивает удобный способ выбора элементов из последовательности, будь то список, кортеж или множество. Вооружившись списком потенциальных кандидатов, он произвольно извлекает один элемент, оставляя список нетронутым.

    Синтаксис метода предельно прост: choice(последовательность).

    АргументОписание
    последовательностьМассив элементов, из которого будет произведен выбор

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

    Произвольный Выбор в Списке

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

    В Python есть несколько способов добиться этого.

    Подходящим и удобным методом является использование модуля random.

    Он предоставляет нам функцию choice(sequence), которая выбирает произвольный элемент из любой последовательности, к которой принадлежит и список.

    Давайте рассмотрим пример с использованием списка ["a", "b", "c", "d"].

    import random выбранный_элемент = random.choice(["a", "b", "c", "d"]) print(выбранный_элемент) – эта функция может выбрать любой из элементов списка одинаково вероятным образом, и возвращать элемент соответствующего типа (в нашем случае, строку).

    Неистинно Случайные Алгоритмы

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

    Эти творения получили название псевдослучайных последовательностей.

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

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

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

    Управление Генератором Псевдослучайных Чисел

    ГПСЧ – это алгоритм, который генерирует последовательность чисел, которые кажутся случайными, но на самом деле детерминированы.

    Для управления ГПСЧ используется объект Random:

    rnd = random.Random(семя)

    где семя – целое число, определяющее начальное состояние ГПСЧ. Одинаковое семя приведет к одинаковой последовательности чисел.

    Для сброса ГПСЧ на новое начальное состояние вы можете использовать функцию seed(семя):

    rnd.seed(семя)

    Использование Встроенной Функции `seed()`

    Блок кода ниже демонстрирует управление ГПСЧ с помощью функции seed(). Вы заметите, что первый блок генерирует одинаковые числа, а второй – разные, поскольку мы использовали разные значения для семени:

    >>> import random
    >>> rnd = random.Random()
    >>> rnd.seed(1234)
    >>> for i in range(5):
    ...     print(rnd.random())
    ...
    0.2574276425912201
    0.9025329152504408
    0.22578791177907458
    0.5428293899196356
    0.23665242814871738
    >>> rnd.seed(4321)
    >>> for i in range(5):
    ...     print(rnd.random())
    ...
    0.02923798318329119
    0.7555372465859733
    0.6781297884508392
    0.12525033887845753
    0.19744004799846775
    

    Инициализация Генератора

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

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

    Чтобы результат каждый раз не был одним и тем же, при инициализации генератора необходимо задать начальное состояние.

    Начальное Состояние

    Начальное Состояние

    Начальное состояние может быть задано с помощью одного из методов:

    1. Без аргументов (используется ныне устаревшее начальное состояние)
    2. Указание начального значения состояния
    3. Указание объекта, обладающего методом __int__()

    В первом случае мы полагаемся на неявную реализацию начального состояния, что не всегда приемлемо. Второй метод позволяет нам полностью контролировать начальное состояние.

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

    ## Воспроизведение Сгенерированной Последовательности

    Иногда нам нужно воспроизвести последовательность сгенерированных чисел для последующего анализа или отладки. "Зерно" генератора случайных чисел (ГСЧ) позволяет нам сделать это.

    Зерно – это начальное состояние ГСЧ, которое однозначно определяет последовательность генерируемых чисел. Зафиксировав зерно, мы всегда можем получить ту же последовательность чисел при повторном вызове ГСЧ.

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

    ### Получение Зерна

    Доступ к зерну ГСЧ варьируется в зависимости от конкретной библиотеки یا ماڈیول. Некоторые библиотеки предоставляют метод получения зерна, например `get_state()` в `numpy.random`. Иногда приходится вручную сохранять внутреннее состояние ГСЧ для восстановления зерна.

    ### Установка Зерна

    Чтобы воспроизвести последовательность чисел, мы должны установить зерно ГСЧ на желаемое значение. Это можно сделать с помощью метода `set_state()` в `numpy.random` или аналогичных методов в других библиотеках.

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

    Применение Случайных Величин в Python

    Случайные величины широко применяются в самых разных областях, от статистики до моделирования.

    Они могут имитировать:

    бросок монеты
    поведение частиц в физике
    путь робота в лабиринте

    Кроме того, случайные величины:

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

    Вопрос-ответ:

    Видео:

    Генератор случайных чисел на Python.

    0 Комментариев
    Комментариев на модерации: 0
    Оставьте комментарий