В компьютерных приложениях часто возникает необходимость в подражании случайности, особенно при создании игр. Если в программе присутствует генератор чисел, который вырабатывает случайные числа, их можно использовать для определения различных путей выполнения программы или случайного выбора объекта из коллекции. Главная задача – сгенерировать число. Эмуляция другого типа случайности также строится на этом принципе.
Мы не можем с уверенностью утверждать, существует ли случайность в природе или это просто наше представление из-за недостатка знаний. Что мы знаем точно, так это то, что в программировании настоящей случайности нет. Произвольное число не возьмется из ниоткуда, и запрограммировать его появление невозможно. Однако можно создать программу, которая, применяя сложную формулу к "зерну", выдает число, кажущееся случайным.
"Зерно" – это исходные данные для формулы. Например, в качестве "зерна" может выступать системное время в миллисекундах, которое постоянно изменяется, и поэтому "зерно" всегда будет различным. Программист также может задать его вручную.
Такую программу (точнее модуль или функцию) называют генератором псевдослучайных чисел. В стандартной библиотеке языка 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
Практическая работа
- Используя функцию randrange(), получите псевдослучайное четное число в диапазоне от 6 до 12. Также получите число, кратное пяти, от 5 до 100.
- Напишите программу, которая запрашивает у пользователя границы диапазона и тип числа (целое или вещественное), которое он хочет получить. На экран выводится подходящее случайное число.