Попытка вывести вероятность для двух пар - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь сделать простую покерную игру, в которой я бы смоделировал каждую руку, показанную в опциях, как без пары, одной пары, двух пар и т. Д.

Я пытаюсь распечатать вероятность, используяСчитать, чтобы увеличивать каждый раз, когда он раздает новую руку

def twopair():
    count = 0
    while True:
        cards = []
        for i in range(5):
            cards.append(random.choice([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]))
        stop = False 
        counted_cards = Counter(cards)
        two_most_common, count = zip(*counted_cards.most_common(2))

        count_to_message = {
            (1, 1): "Nothing",
            (2, 1): "One Pair",
            (3, 1): "Three of a Kind",
            (4, 1): "Four of a Kind",
            (5, 1): "Five of a Kind",
            (2, 2): "Two Pairs",
            (3, 2): "Full House",
        }

        msg = count_to_message[count]
        print(msg)
        if msg == "Two Pairs":
            stop = True
            break
        #else:
         #   count+=1
    #print(f'Count is {1/count}')

Если вы удалите #, это выдаст ошибку не может конкатенировать кортеж с int.Что я могу сделать, чтобы решить эту проблему, чтобы подсчитать, чтобы я мог разделить счет на 1, чтобы получить вероятность получения двух пар?

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Простая команда print показывает, что вы перегрузили свою переменную count: вы пытаетесь использовать ее в качестве кортежа количества карт и подсчета того, сколько раз вы 'Встретил 2 пары.Вам нужны две отдельные переменные для двух одновременных концепций.

Я исправил пару других проблем с кодом:

import random
from collections import Counter

pair_count = 0
while True:
    cards = []
    for i in range(5):
        cards.append(random.choice([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]))
    stop = False 
    counted_cards = Counter(cards)
    two_most_common, count = zip(*counted_cards.most_common(2))
    print(two_most_common, count)

    count_to_message = { 
        (1, 1): "Nothing",
        (2, 1): "One Pair",
        (3, 1): "Three of a Kind",
        (4, 1): "Four of a Kind",
        (5, 1): "Five of a Kind",
        (2, 2): "Two Pairs",
        (3, 2): "Full House",
    }   

    msg = count_to_message[count]
    print(msg)
    if msg == "Two Pairs":
        break

    pair_count+=1

print('Count is', 1/pair_count)

Вывод:

(4, 6) (1, 1)
Nothing
(5, 9) (1, 1)
Nothing
(7, 8) (2, 1)
One Pair
(10, 11) (2, 1)
One Pair
(12, 6) (2, 1)
One Pair
(7, 13) (2, 1)
One Pair
(11, 4) (1, 1)
Nothing
(13, 7) (2, 1)
One Pair
(2, 1) (1, 1)
Nothing
(12, 13) (2, 2)
Two Pairs
Count is 0.1111111111111111

У вас все еще естьпара проблем, особенно в том, что не точный показатель вероятности получения двух пар.

0 голосов
/ 25 сентября 2019

Couter.most_common() возвращает список кортежей (элемент, количество): https://docs.python.org/2/library/collections.html

И когда вы пишете:

>>> two_most_common, count = zip(*counted_cards.most_common(2))
>>> type(count)
<class 'tuple'>
>>>

count не остается int.Так, count+=1 выдает ошибку.

Поскольку count является кортежем, вы можете получить доступ к значениям внутри него с помощью count[0], count[1] в зависимости от того, что вы пытаетесь сделать.

...