如何防止重复的随机值?(How to prevent repeated random values?

2019-10-29 02:55发布

该CPU和用户越来越重复的卡片。 我用的随机播放功能,以及流行。 有没有一种方法,以防止useer和CPU从得到反复卡。

下面是编译的程序的一个例子

这里是您的卡:1)10俱乐部2)钻石3)钻石4)俱乐部5)俱乐部的10的7打牌的6所述的图4,简单地在一个时间输入他们的电话号码之一。 完成后,输入空白2 1 3 4

你玩过:钻石的4俱乐部的10颗钻石俱乐部的7的6

CPU发挥:黑桃的黑桃的杰克杰克

正如你所看到的,用户被提示重复的“随机”卡和CPU玩重复的“随机”卡。

        import random
        import math
        print("Gui-less poker sucks, but it sure is addicting probably")
        if 1:
            hcardss = [""]
            hcardsc = [""]
            hcardsh = [""]
            ccardss = [""]
            ccardsc = [""]
            ccardsh = [""]
            ingame = "true"
            while (ingame == "true"):
                undone = 5
                while (undone > 0):
                    card = random.randint(1,52)
                    # 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
                while (undone > 0):
                    # THIS ONE IS THE COMPUTER
                    card = random.randint(1,52)
                    # 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")
                doneinput = "false"
                hplay = [""]
                while (doneinput == "false"):
                    latestinput = input("> ")
                    if (latestinput == ""):
                        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(hplayh))
                #print(str(cplayh))


                ingame = "false"

Answer 1:

不要使用randint()来接卡的。 构建“甲板”,这仅仅是一个卡列表中,使用随机()随机化它,和pop()来处理卡。 另外,我建议代表与数字,而不是字符串卡。 字符串是人类。 数字会让你的代码的其余部分更加简单和快速。 只是翻译需要时字符串用户。

就像是:

theDeck = [];

def shuffle():
    theDeck = range(52)
    random.shuffle(theDeck)

def dealCard():
    return theDeck.pop()

def nameOfCard(c):
    return [ "Deuce", "Trey", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" ][c >> 2] + \
        " of " + [ "Clubs", "Diamonds", "Hearts", "Spades" ][c & 3];


Answer 2:

你必须保持所有已在发挥卡的列表,然后检查是否最近生成的卡是在该列表中,如果是这样,重新生成它。

generated_cards = []
...
card = random.randint(1,52)
while card in generated_cards:
    card = random.randint(1,52)
generated_cards.append(card)  # once the card is a new, unique one,
                              # add it to the generated_cards list 

处理这种情况的一个更简单的方法可能产生的卡列表,随机播放他们,他们弹出他们从名单上一个接一个。

deck_of_cards = [x for x in range(0, 52)]
random.shuffle(deck_of_cards)
...
card = deck_of_cards.pop()  # this removes the item from the list 
                            # and puts it in the card variable


Answer 3:

加入打牌上市。 已经检查新的随机卡在此列表中,如果再生新卡,直到它不在列表中。 不要忘记检查列表有所有的牌,以避免死循环。 PS不要使用此方法,产生一次所有的列表和洗牌它有效得多。



文章来源: How to prevent repeated random values?