Python
Случайное число в диапазоне Python
Случайное число в диапазоне в Python чаще всего получают через модуль random. Для целых чисел подходят randint() и randrange(), для дробных — uniform(), а для случайного выбора из списка — choice()
Главная ловушка для новичка: разные функции по-разному работают с границами диапазона. У randint(1, 10) число 10 может выпасть, а у randrange(1, 10) число 10 уже не входит в диапазон
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Целое число через randint
import random
number = random.randint(1, 10)
print(number)
Этот код выведет целое число от 1 до 10 включительно
randint(a, b) подходит, когда вам нужен понятный человеческий диапазон: от одного значения до другого, включая обе границы
Несколько случайных чисел
import random
for _ in range(5):
print(random.randint(1, 6))
Так можно имитировать пять бросков кубика. Переменная _ показывает, что номер повторения нам не нужен
Если нужно сохранить числа в список:
import random
numbers = []
for _ in range(10):
numbers.append(random.randint(100, 999))
print(numbers)
randrange и отличие от randint
randrange() работает похоже на range(): правая граница не включается
import random
number = random.randrange(1, 10)
print(number)
Такой код вернет число от 1 до 9
Если нужен шаг, randrange() удобнее randint()
import random
even_number = random.randrange(2, 21, 2)
print(even_number)
Здесь выпадет случайное четное число от 2 до 20
Дробное число в диапазоне
Для дробного числа используйте uniform()
import random
price = random.uniform(10, 20)
print(price)
В выводе будет дробное число между 10 и 20
Если нужен красивый результат с двумя знаками:
import random
price = random.uniform(10, 20)
print(round(price, 2))
round() округляет число для вывода, но не делает его денежным типом данных. Для реальных финансовых расчетов лучше использовать Decimal
Случайный элемент списка
Когда нужен не диапазон чисел, а случайный вариант из набора, используйте choice()
import random
colors = ['red', 'green', 'blue']
color = random.choice(colors)
print(color)
Так удобно выбирать случайный вопрос, промокод, цвет, имя тестового пользователя или уровень сложности
Если список пустой, choice() выдаст ошибку. Поэтому в рабочем коде лучше проверять данные
import random
items = []
if items:
print(random.choice(items))
else:
print('список пуст')
Перемешать список
shuffle() меняет список на месте
import random
cards = ['A', 'K', 'Q', 'J']
random.shuffle(cards)
print(cards)
Если нужно получить перемешанную копию и не трогать исходный список, используйте sample()
import random
cards = ['A', 'K', 'Q', 'J']
shuffled = random.sample(cards, len(cards))
print(cards)
print(shuffled)
Повторяемый результат через seed
Иногда случайность должна быть повторяемой: например, в тестах или учебных примерах
import random
random.seed(42)
print(random.randint(1, 10))
print(random.randint(1, 10))
print(random.randint(1, 10))
При одинаковом seed последовательность будет одинаковой
Не используйте seed() для безопасности. Он нужен для воспроизводимости, а не для защиты токенов или паролей
Когда нужен secrets
Модуль random не подходит для паролей, токенов, кодов подтверждения и других чувствительных данных
Для таких задач используйте secrets
import secrets
code = secrets.randbelow(900000) + 100000
print(code)
Этот пример генерирует шестизначное число от 100000 до 999999
Для одноразового токена:
import secrets
token = secrets.token_hex(16)
print(token)
Мини-проект: угадай число
import random
secret = random.randint(1, 10)
answer = int(input('Угадайте число от 1 до 10: '))
if answer == secret:
print('угадали')
else:
print(f'нет, было число {secret}')
Это короткий пример, но в нем есть реальная логика: генерация, ввод пользователя, сравнение и вывод результата
Для тренировки можно добавить три попытки:
import random
secret = random.randint(1, 10)
for attempt in range(3):
answer = int(input('Ваш вариант: '))
if answer == secret:
print('угадали')
break
elif answer < secret:
print('число больше')
else:
print('число меньше')
else:
print(f'попытки закончились, было число {secret}')
Частые ошибки
- забывать, что
randint(1, 10)включает 10 - ожидать, что
randrange(1, 10)включает 10 - использовать
randomдля паролей и токенов - вызывать
random.seed()в рабочем коде без причины - выбирать элемент из пустого списка
- путать
shuffle()иsample() - округлять дробные числа и думать, что это решает денежные расчеты
Для целого случайного числа от a до b включительно используйте random.randint(a, b)
Для диапазона с невключенной правой границей и шагом используйте random.randrange()
Для дробного числа подходит random.uniform(), для выбора элемента — random.choice(), для безопасных токенов — secrets