python - 如何停止获得重复的随机值?

标签 python random shuffle poker

CPU 和用户收到重复的卡片。我使用了 shuffle 函数以及 pop。有没有办法防止用户和CPU重复卡牌?

这是一个执行示例:

Here are your cards:
1) The 10 of Clubs
2) The 4 of Diamonds
3) The 6 of Diamonds
4) The 7 of Clubs
5) The 10 of Clubs

To play cards, simply type their number one at a time. When done, input blank

2 1 3 4

You played: The 4 of Diamonds The 10 of Clubs The 6 of Diamonds The 7 of Clubs

CPU played: The Jack of Spades The Jack of Spades

如您所见,用户获得了两次梅花 10。

我的代码:

import random
import math
from collections import Counter
print("Gui-less poker sucks, but it sure is addicting probably")
if 1:
    deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52]
    random.shuffle(deck)
    hcardss = [""]
    hcardsc = [""]
    hcardsh = [""]
    ccardss = [""]
    ccardsc = [""]
    ccardsh = [""]
    ingame = "true"
    while (ingame == "true"):
        undone = 5
        while (undone > 0):
            card = deck.pop()
            # print(card)
            temp = card / 13
            temp2 = card / 4
            temp = math.floor(temp)
            temp2 = math.floor(temp2)
            temp = temp + 1
            # temp2 = temp2 + 1
            #print(temp)
            #print(temp2)
            # undone -= 1
            hcardss.append(temp)
            hcardsc.append(temp2)
            if (temp == 1):
                temp3 = " of Spades"
            elif (temp == 2):
                temp3 = " of Diamonds"
            elif (temp == 3):
                temp3 = " of Clubs"
            else:
                temp3 = " of Hearts"
            if (temp2 == 10):
                temp4 = "Jack"
            elif (temp2 == 11):
                temp4 = "Queen"
            elif (temp2 == 12):
                temp4 = "King"
            elif (temp2 == 13):
                temp4 = "Ace"
            else:
                temp4 = str(temp2 + 1)
            # print("Your card was the " + temp4 + temp3)
            hcardsh.append("The " + temp4 + temp3)
            undone -= 1
        undone = 5
        random.shuffle(deck)
        while (undone > 0):
            # THIS ONE IS THE COMPUTER
            card = deck.pop()
            # print(card)
            temp = card / 13
            temp2 = card / 4
            temp = math.floor(temp)
            temp2 = math.floor(temp2)
            temp = temp + 1
            # temp2 = temp2 + 1
            #print(temp)
            #print(temp2)
            # undone -= 1
            ccardss.append(temp)
            ccardsc.append(temp2)
            if (temp == 1):
                temp3 = " of Spades"
            elif (temp == 2):
                temp3 = " of Diamonds"
            elif (temp == 3):
                temp3 = " of Clubs"
            else:
                temp3 = " of Hearts"
            if (temp2 == 10):
                temp4 = "Jack"
            elif (temp2 == 11):
                temp4 = "Queen"
            elif (temp2 == 12):
                temp4 = "King"
            elif (temp2 == 13):
                temp4 = "Ace"
                temp4 = str(temp2 + 1)
            # print("Your card was the " + temp4 + temp3)
            ccardsh.append("The " + temp4 + temp3)
            undone -= 1
        print()
        print()
        print()
        print("Here are your cards:")
        print("1) " + hcardsh[1])
        print("2) " + hcardsh[2])
        print("3) " + hcardsh[3])
        print("4) " + hcardsh[4])
        print("5) " + hcardsh[5])
        print("To play cards, simply type their number one at a time. When done, input blank")
        instant = "true"
        doneinput = "false"
        hplay = [""]
        while (doneinput == "false"):
            latestinput = input("> ")
            if (latestinput == ""):
                if (instant == "true"):
                    print("Okay, you fold")
                    ingame = "false"
                    exit()
                doneinput = "true"
            else:
                if (int(latestinput) in hplay):
                    print("You already picked that one!")
                else:
                    hplay.append(int(latestinput))
        # print("The cards you played are " + str(hplay))
        doneinput = "false"
        cplay = [""]
        while (doneinput == "false"):
            latestinput = random.randint(1,5)
            if (latestinput == ""):
                doneinput = "true"
            else:
                if (int(latestinput) in cplay):
                    doneinput = "true"
                else:
                    cplay.append(int(latestinput))
        #print("So you played " + str(hplay))
        #print("And the cpu played " + str(cplay))
        #print("So you played the " + hcardsh[hplay[1]] + hcardsh[hplay[2]]
        times = len(hplay)
        # times = times - 1
        hplayh = [""]
        cplayh = [""]
        sub = 1
        print()
        print()
        print("You played:")
        while (sub < times):
            hplayh.append(hcardsh[hplay[sub]])
            print(hcardsh[hplay[sub]])
            sub += 1
        sub = 1
        times = len(cplay)
        print()
        print()
        print("CPU played:")
        while (sub < times):
            cplayh.append(ccardsh[cplay[sub]])
            print(ccardsh[cplay[sub]])
            sub += 1
        #print(str(hplay)
        #print(str(cplayh))
        hscore = 0
        cscore = 0
        #checker = 1
        #highnumber = 0
        #quantity = [""]
        #quancheck = 0
        htrans = [""]
        temp5 = 1
        while (len(hplay) > temp5):
            htrans.append(int(hcardsc[hplay]))
            temp5 += 1
        ctrans = [""]
        temp5 = 1
        while (len(cplay) > temp5):
            ctrans.append(int(ccardsc[cplay]))
            temp5 += 1

        hoccur = Counter(htrans).most_common()
        coccur = Counter(ctrans).most_common()
        print(hoccur)
        #while (len(hplay) > checker):
         #   if (hcardsc[hplay[checker]] > highnumber):
          #      quancheck += 1
           # quantity.append(quancheck)
            #checker += 1


        ingame = "false"

最佳答案

通过打乱列表并从中弹出值来生成 1 到 52 之间的卡号的方式是正确的。

问题在于你如何根据牌号生成牌的花色和面值。

例如,

  • 楼层(26/4)= 7,楼层(27/4)= 7
  • 楼层(26/13)= 2,楼层(27/13)= 2

因此 26 和 27 将被解释为同一张牌。

保留你原来的想法,你可以使用除以 13 的商和余数:

q = card_num // 13 # integer division
r = card_num % 13  # modulo operator

或者同时使用 divmod:

q, r = divmod(26, 13)
print(q,r)
# (2, 0)
q, r = divmod(27, 13)
print(q,r)
# (2, 1)

你将有 0 <= q <= 3 和 0 <= r <= 13

附注:
您可以改进代码中的一些内容。一个简单的改变:

deck = list(range(1, 53))

会更短! ;)

关于python - 如何停止获得重复的随机值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220770/

相关文章:

python - 如何从其整数表示中获取单个 unicode 字符?

python - python httplib 的各种超时

python - 如何使用 sqlalchemy 对整数支持的枚举进行建模?

java - 在java中使用更长的种子生成随机数

shuffle - 使用最新spark版本时如何设置spark.sql.shuffle.partitions

python - 生成具有均匀元素频率的随机混洗列表

python - 如何使用 3to2

c++ - 在伪随机数生成中使用整个列表

python - 随机改变数字

c++ - 如何打乱数组以便所有元素改变它们的位置