Как изменить эту программу, чтобы использовать random.shuffle вместо random.sample? - PullRequest
0 голосов
/ 29 апреля 2020

Мне было интересно, был ли кто-нибудь, кто хотел бы помочь мне, когда дело дошло до этой программы. Предыстория заключается в создании карточной игры, в которой, когда вы берете 6 случайных карт, если одна карта является тузом, игрок выигрывает доллар, если не теряет доллар. Это продолжается до тех пор, пока игрок не удвоит свои деньги или не потеряет их все. Игра запускается 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.sample я мог бы использовать random.shuffle. Я пытался изменить эту программу многими способами, но всякий раз, когда я это делаю, мои конечные результаты не совпадают. Я просто пытаюсь изменить раздел, где я должен брать карты. При запуске этой программы, начиная с начальных 10, ответом является округление от 45 до 50 с точки зрения сыгранных раундов. Изменить: Пытаясь сохранить программу относительно того же, только хочу изменить то, что мне действительно нужно.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Самое разумное изменение ;-) - заменить

    table = random.sample(shuffledDeck(),6)

на

    table = random.sample(d, 6)

Нет необходимости перестраивать колоду. Если вы решили использовать более дорогой .shuffle() вместо этого, то, например, замените эту строку на

    random.shuffle(d)
    table = d[:6] # or d[-6:], or any other way of picking 6
0 голосов
/ 29 апреля 2020

Я думаю, что вы можете использовать более простой подход к игровой механике. Используйте numpy, чтобы взять шесть случайных целых чисел от 1 до 52. Определите тузы как имеющие значение 1-4. Поэтому, если первый элемент отсортированного массива <5, то вы нарисовали туза. </p>

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')

Вы можете повторить розыгрыш в l oop всякий раз, когда вам нужно сделать еще один раунд.

Если вам нужно сохранить названия карт, то собирайте колоду один раз и отбирайте шесть элементов из массива колод на каждой итерации. Нет необходимости тасовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...