#python
Вопрос:
Я хочу случайным образом выбрать 500 карт из стандартной колоды из 52 карт и показать, сколько раз был выбран Бубновый туз. Я не уверен, как зациклить его и заставить случайным образом выбрать 500 карт. То, что я попробовал, привело к тому, что одну и ту же карту выбирали 500 раз. В настоящее время это то, что у меня есть:
import random
card_number = random.randint(0,52)
card_value = card_number % 13
card_suit = card_number // 13
ace = 0
print(card_value, card_suit)
if card_value == 0:
card_value = "A"
if card_suit == 0:
card_suit = "♥"
if card_value == 1:
card_value = "K"
if card_suit == 1:
card_suit = "♠"
if card_value == 12:
card_value = "Q"
if card_suit == 2:
card_suit = "♦"
if card_value == 11:
card_value = "J"
if card_suit == 3:
card_suit = "♣"
if card_value == 0 and card_suit == 2:
ace = ace 1
card = str(card_value) str(card_suit)
print(card)
print("The Ace of Diamonds has appeared", ace , "times")
Комментарии:
1. Начните с
for i in range(500):
того, чтобы повторить 500 раз.2. Вы должны получать новое случайное число каждый раз, когда зацикливаете его. В частности, вы должны поместить объявление random int в верхней части цикла
card_number = random.randint(0,52)
, так как именно здесь вы получаете фактическое число.
Ответ №1:
Вы можете использовать for
цикл для повторения 500 раз, чтобы выбрать 500 карт и проверить результаты каждой карты. Поскольку количество итераций не влияет ни на какие выходные данные, _
в качестве итератора можно использовать фиктивную переменную.
aces = 0
for _ in range(500):
card_number = random.randint(0,52)
card_value = card_number % 13
card_suit = card_number // 13
...
Теперь, поскольку вас интересует только количество раз, когда Бубновый туз извлекается из колоды, нет необходимости проверять каждую комбинацию масти и стоимости. Вместо этого проверьте только, является ли масть бриллиантами (2), а значение-Тузом (0). (Вы также можете использовать встроенную функцию divmod(x, y)
, которая возвращает x // y, x % y
.)
diamond_aces = 0
for _ in range(500):
card_number = random.randint(0, 52)
card_suit, card_value = divmod(card_number, 13)
if card_suit == 2 and card_value == 0:
diamond_aces = 1
Условие if card_suit == 2 and card_value == 0:
может быть заменено любым из следующих (неполный список):
if (card_suit, card_value) == (2, 0):
if divmod(card_number, 13) == (2, 0):
if divmod(random.randint(0, 52), 13) == (2, 0):
Однако, если divmod(card_number, 13) == (2, 0)
значение равно True
, то условие 2 * 13 0 == card_number
(26) должно быть True
обратным divmod()
. Таким образом, это может быть еще более упрощено до:
diamond_aces = 0
for _ in range(500):
if random.randint(0, 52) == 26:
diamond_aces = 1
Или для энтузиастов понимания списка:
diamond_aces = [True for _ in range(500) if random.randint(0, 52) == 26].count(True)
Ответ №2:
Я думаю, вам на самом деле не нужны все эти условия «если» посередине, если вы сосредоточены только на бубновых тузах! Ваш код может быть изменен следующим образом:
import random
ace = 0
for i in range(500):
card_number = random.randint(0,52)
card_value = card_number % 13
card_suit = card_number // 13
if card_value == 0 and card_suit == 2: #This is where the main Ace of Diamonds check is happening
ace = ace 1
print("The Ace of Diamonds has appeared", ace , "times")