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

Мы не можем с уверенностью утверждать, существует ли случайность в природе или это просто наше представление из-за недостатка знаний. Что мы знаем точно, так это то, что в программировании настоящей случайности нет. Произвольное число не возьмется из ниоткуда, и запрограммировать его появление невозможно. Однако можно создать программу, которая, применяя сложную формулу к "зерну", выдает число, кажущееся случайным.

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

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

На этом уроке мы обсудим функции random(), randrange() и randint() из модуля random. Имейте в виду, что в модуле random присутствует одноимённая функция random(). Бывает и такое.

Чтобы воспользоваться функциями, необходимо импортировать модуль random:

>>> import random

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

>>> from random import random, randrange, randint

Функции получения целых псевдослучайных чисел — randint() и randrange()

Функции randint() и randrange() предназначены для генерации псевдослучайных целых чисел. Первая из них является более простой, так как она всегда принимает два аргумента — границы целочисленного диапазона, из которого выбирается любое число:

>>> random.randint(0, 10)
6

или (при импорте отдельных функций):

>>> randint(100, 200)
110

В случае randint() обе границы включены в диапазон, т. е. на математическом языке он обозначается как [a; b].

Числа могут быть отрицательными:

>>> random.randint(-100, 10)
-83
>>> random.randint(-100, -10)
-38

Важно отметить, что первое число всегда должно быть меньше или равно второму, то есть условно a <= b.

Функция randrange() предоставляет больше возможностей. Она может принимать один, два или даже три аргумента. Если указан только один, то возвращается случайное число от 0 до этого аргумента, не включая последний. На математическом языке это описывается как [0; a).

>>> random.randrange(10)
4

Или:

>>> randrange(5)
0

При передаче функции randrange() двух аргументов она ведёт себя как randint(), за исключением того, что верхняя граница не включается в диапазон, т. е. [a; b).

>>> random.randrange(5, 10)
9
>>> random.randrange(1, 2)
1

В этом случае второй вызов всегда будет возвращать число 1.

Если в randrange() используются три аргумента, то первые два обозначают границы диапазона, как в случае с двумя аргументами, а третий аргумент определяет шаг. Используя randrange(10, 20, 3), можно получить одно из следующих чисел: 10, 13, 16, или 19:

>>> random.randrange(10, 20, 3)
13
>>> random.randrange(10, 20, 3)
19
>>> random.randrange(10, 20, 3)
10

Функция random() для генерации вещественных "случайных" чисел

Чтобы получить случайное вещественное число, следует воспользоваться функцией random() из одноименного модуля Python. Эта функция не требует аргументов и возвращает число от 0 до 1, исключительно:

>>> random.random()
0.17855729241927576
>>> random.random()
0.3310978930421846

или такой вариант:

>>> random()
0.025328854415995194

Лучше использовать большую точность, но если вам требуется округлить результат, то в Python удобно воспользоваться функцией round():

>>> a = random.random()
>>> a
0.8366142721623201
>>> round(a, 2)
0.84
>>> round(random.random(), 3)
0.629

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

>>> random.random() * 10
2.510618091637596
>>> random.random() * 10
6.977540211221759

Если требуется нижняя граница, отличная от нуля, просто умножьте число из random() на разницу между верхней и нижней границами, добавив нижнюю границу:

>>> random.random() * (10 - 4) + 4
9.517280589233597
>>> random.random() * (10 - 4) + 4
6.4429124181215975
>>> random.random() * (10 - 4) + 4
4.9231983600782385

В этом примере число умножается на 6, и результат — число в диапазоне от 0 до 6. Добавляем 4 и получаем число от 4 до 10.

Для примера получения чисел в диапазоне от -1 до 1:

>>> random.random() * (1 + 1) - 1
-0.673382618351051
>>> random.random() * (1 + 1) - 1
0.34121487148075924
>>> random.random() * (1 + 1) - 1
-0.988751324713907
>>> random.random() * (1 + 1) - 1
0.44137358363477674

Здесь нижняя граница равна -1. Когда добавляется верхняя граница, то происходит замена на минус ( +(-1) = - 1).

Используя функцию random(), можно генерировать любые псевдослучайные числа. Если необходимо получить целое число, его можно округлить с помощью функции round() или отбросить дробную часть с помощью int():

>>> int(random.random() * 100)
61
>>> round(random.random() * 100 - 50)
-33

Практическая работа

  1. Используя функцию randrange(), получите псевдослучайное четное число в диапазоне от 6 до 12. Также получите число, кратное пяти, от 5 до 100.
  2. Напишите программу, которая запрашивает у пользователя границы диапазона и тип числа (целое или вещественное), которое он хочет получить. На экран выводится подходящее случайное число.

Вопросы для самопроверки:

  1. Какой модуль из стандартной библиотеки Python используется для работы с псевдослучайными числами?
  2. Какие функции из модуля random предназначены для генерации псевдослучайных целых чисел?
  3. Каков диапазон, включаемый в функцию randint()?
  4. Чем функция randrange() отличается от функции randint() в отношении включения верхней границы диапазона?

Программа курса:

  1. Описание курса
  2. Эволюция и основы языков программирования

    История программирования в кратком и понятном изложении. Что такое машинный язык, почему появились ассемблеры, языки высокого уровня и объектно-ориентированные. Зачем нужен транслятор, и почему он может быть либо компилятором, либо интерпретатором.

  3. Знакомство с основами Python

    Особенности языка Python, работа в интерактивном режиме и подготовка файлов с исходным кодом.

  4. Типы данных и переменные в Python

    Базовые типы данных в Python: целое, вещественное числа, строки. Изменение типа данных с помощью встроенных функций. Понятие об операциях и переменных. Присваивание значения переменной.

  5. Ввод и вывод данных с Python функциями

    Для вывода на экран в Python 3.x используется функция print(). Вывод может быть предварительно отформатирован. Для ввода данных с клавиатуры используется функция input(), которая возвращает в программу строку.

  6. Логические выражения и операторы в Python

    Логические выражения. Логические операторы языка Python: == (равно), != (не равно), (больше), = (больше или равно), and (логическое И), or (логическое ИЛИ), not (отрицание).

  7. Ветвление и условные операторы в Python

    Управление потоком программы с помощью операторов if-else. Создание логических ветвлений, обработка условий и выполнение разных блоков кода в Python.

  8. Изучите обработку ошибок и исключений в Python

    Общее представление об ошибках и исключениях в языке программирования Python. SyntaxError, NameError, TypeError, ValueError, ZeroDivisionError. Обработка исключений с помощью инструкции try-except.

  9. Множественное ветвление с if-elif-else в Python

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

  10. Цикл while и его применение в Python

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

  11. Изучите функции и их применение в Python

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

  12. Локальные и глобальные переменные в Python

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

  13. Оператор return и возврат значений в Python

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

  14. Параметры и аргументы функций в Python

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

  15. Встроенные функции Python для работы

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

  16. Использование модулей в Python

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

  17. Генерация псевдослучайных чисел в Python

    Для генерации псевдослучайных чисел в языке программирования Python используются функции модуля random. Функция random() генерирует вещественное число от 0 до 1. Функции randint() и randrange() производят целые псевдослучайные числа в указанных диапазонах.

  18. Изучение списков в Python - основы и операции

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

  19. Изучение цикла for в Python

    Цикл for в языке программирования Python предназначен для перебора элементов структур данных (списков, словарей, кортежей, множеств) и многих других объектов. Это не цикл со счетчиком, каковым является for во многих других языках. Нередко цикл for используется совместно с функцией range(), генерирующей объекты-диапазоны.

  20. Строки в Python - методы и срезы

    В Python строки - это неизменяемые последовательности символов или подстрок. Из них, так же как из списков, можно извлекать отдельные символы с помощью индексов или подстроки с помощью взятия срезов. В языке Python есть множество встроенных строковых методов, позволяющих упростить обработку строк.

  21. Кортежи - неизменяемые структуры данных

    Кортежи в Python - это неизменяемые структуры данных, состоящие из элементов одного или разных типов. Кортежи подобны спискам и обычно используются для защиты последних от изменений. Преобразование одного в другой выполняется с помощью встроенных функций tuple() и list().

  22. Словари в Python - работа с ключами и значениями

    Словарь в Python - это изменяемая неупорядоченная структура данных, элементами которой являются пары "ключ:значение". В словари можно добавлять и удалять элементы, изменять значения ключей. В Python словари имеют ряд методов, упрощающих работу с ними.

  23. Работа с файлами в Python

    В языке программирования Python открытие файлов выполняется с помощью функции open(), которой передается два аргумента - имя файла и режим. Файл может быть открыт в режиме чтения, записи, добавления. Также может быть указан тип файла - текстовый или бинарный. Для файлов есть ряд встроенных методов чтения, записи и др.