首页 > 解决方案 > 如何更改此程序以使用 random.shuffle 而不是 random.sample?

问题描述

我想知道是否有人愿意帮助我,当涉及到这个程序时。背景故事是创建一个纸牌游戏,当你随机抽取 6 张牌时,如果其中一张牌是 A,则玩家赢一美元,否则输一美元。这种情况一直持续到玩家将钱翻倍或全部输光。游戏运行 1000 次,初始初始为 10 美元。这是我的代码:

import random

faceValues = ['ace', '2', '3', '4', '5', '6',
              '7', '8', '9', '10', 'jack',
              'queen', 'king']
suits = ['clubs', 'diamonds', 'hearts',
         'spades']
def shuffledDeck():
    deck = []
    for faceValue in faceValues:
        for suit in suits:
            deck.append(faceValue + ' of ' + suit)
    random.shuffle(deck)
    return deck

def faceValueOf(card):
    return card.split()[0]

def suitOf(card):
    return card.split()[2]

d = shuffledDeck()

def game(initial):
    counts = 0
    bankroll = initial
    while 0 < bankroll < 2*initial:
        ace = 0
        table = random.sample(shuffledDeck(),6)
        counts += 1
        for cards in table:
            if faceValueOf (cards) == 'ace':
                ace += 1
        if ace >= 1:
            bankroll += 1
        else:
            bankroll -= 1

    return counts


initial = float(input('Enter initials: '))
totalcounts = 0
for x in range(1000):
    totalcounts += game(initial)

print('Average number of rounds: ', totalcounts/1000)

我想知道如何才能改变这个程序,所以我可以使用 random.shuffle,而不是使用 random.sample。我尝试了很多方法来改变这个程序,但无论什么时候,我的最终结果都不一样。我只是想改变我必须抽牌的部分。当从最初的 10 开始运行这个程序时,就所玩的回合而言,答案是大约 45 到 50。编辑:试图保持程序相对相同,只想改变我真正需要的。

标签: pythonpython-3.xfunctionrandomshuffle

解决方案


我认为您可以对游戏机制采取更简单的方法。用于numpy从 1 到 52 取六个随机整数。将 ace 定义为具有 1-4 的值。因此,如果已排序数组的第一个元素 < 5,那么您就画了一张 ace。

import numpy as np

# simulates six cards
draw = np.sort(np.random.randint(1, 52, 6)) 
if draw[0] < 5:
    print('drew an ace')
else:
    print('did not draw an ace')

每当您需要进行另一轮时,您可以在循环中重复抽签。

如果您需要保留卡片名称,则构建卡片组一次,并在每次迭代时从卡片组数组中采样六个项目。没有必要洗牌。


推荐阅读