Отображение того, сколько раз число x было выбрано из 500 случайных чисел

#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")