Глава 5 · Давайте поиграем с числами!
choice, choices, sample, shuffle
Четыре похожих инструмента для случайного выбора — отличаются тем, сколько элементов выбирают и можно ли повторяться.
Кроме случайных чисел, random умеет случайно выбирать
из готового набора значений — списка вариантов, колоды карт, списка имён.
Четыре похожих, но разных инструмента
| Функция | Сколько выбирает | Повторы возможны? | Меняет исходный набор? |
|---|---|---|---|
choice(seq) | 1 элемент | — | нет |
choices(seq, k=n) | n элементов | да — один и тот же элемент может повториться | нет |
sample(seq, k=n) | n элементов | нет — все разные | нет |
shuffle(seq) | все элементы | — | да, перемешивает на месте |
choice() — один случайный элемент
choice.py
import random
varianty = ["камень", "ножницы", "бумага"]
print(random.choice(varianty))
choices() — несколько, с возможными повторами
Представим колесо рулетки с призами — один и тот же приз может выпасть снова:
choices.py
import random
prizy = ["🎁", "🎈", "🎉"]
vypavshie = random.choices(prizy, k=5)
print(vypavshie) # например, ["🎈", "🎈", "🎁", "🎉", "🎈"] — повторы допустимы
У choices() есть необязательные веса
random.choices(prizy, weights=[1, 1, 10], k=5) сделает третий приз в десять раз вероятнее остальных — полезно для «нечестных» кубиков или систем с разной редкостью наград.sample() — несколько, без повторов
Представим розыгрыш призов среди участников — один и тот же участник не может выиграть дважды в одном розыгрыше:
sample.py
import random
uchastniki = ["Аня", "Борис", "Вера", "Глеб", "Дана"]
pobediteli = random.sample(uchastniki, k=2)
print(pobediteli) # например, ["Вера", "Аня"] — все разные
k не может быть больше длины набора
random.sample(uchastniki, k=10) при 5 участниках вызовет ValueError — без повторов невозможно выбрать больше элементов, чем есть в наборе. У choices() такого ограничения нет, потому что повторы разрешены.shuffle() — перемешать всё на месте
В отличие от трёх функций выше, shuffle() не выбирает
подмножество — она перемешивает весь список и ничего не возвращает
(None), потому что изменяет список прямо «на месте»:
shuffle.py
import random
koloda = [1, 2, 3, 4, 5]
random.shuffle(koloda)
print(koloda) # например, [3, 1, 5, 2, 4] — тот же список, новый порядок
shuffle() возвращает None — не переприсваивайте результат
koloda = random.shuffle(koloda) — частая ошибка: после неё koloda станет None, хотя перемешивание уже прошло успешно ДО присваивания. Просто вызовите random.shuffle(koloda) отдельной строкой.Практика: choice, choices, sample, shuffle
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки