Игра в кости
У меня есть этот вопрос для назначения:
Ваш друг разработал игру с двумя игроками. Два игрока, называемые A и B, по очереди бросают обычный шестигранный кубик, причем первым бросает A.
Первый игрок, который бросает шестерку, выигрывает игру. Вы и ваш друг не согласны с тем, какова вероятность победы А в игре, и поэтому вы решаете смоделировать игру с помощью компьютера.
Таким образом: напишите программу на Python, которая выполняет 10 испытаний, каждое из которых состоит из 10000 игр, и для каждого испытания печатает долю игр, выигранных игроком A.
Это код, который я получил до сих пор, он просто возвращает число около 1667 и каждый раз. Мне в основном интересно, как отличить А или Б от победы в игре.
Любая помощь будет оценена!
Отредактированный код
import random
def rollDie():
return random.choice([1,2,3,4,5,6])
def roll_first():
if random.choice([0,1]) == 0:
return 'A'
else:
return 'B'
def rollSim():
while True:
turn = roll_first()
numTrials = 10
numThrows = 10000
totalThrows = numTrials*numThrows
game_on = True
winsA = 0
winsB = 0
while game_on:
for n in range(numTrials):
games = 0
for i in range(numThrows):
throw = rollDie()
if turn == 'A':
if throw == 6:
winsA += 1
games += 1
break
else:
turn = 'B'
else:
if throw == 6:
winsB += 1
games += 1
break
else:
turn = 'A'
return winsA/totalThrows
2 ответа
Лучший способ добиться чистого кода - разделить functions
каждая из задач в руках, что означает:
1. Запустите игру -> Для каждого броска костей
2. Запустите игру -> Чередование игр между A и B, пока первый не получит 6 на кости (здесь, учитывая, что если A получает 6, B даже не нужно играть, поскольку A выиграл)
3. Запустите пробную версию -> Состоит из определенного количества игр
4. Запустите основную программу -> Состоит из воспроизведения всего необходимого количества проб
Итак, ниже, является одним из возможных решений (здесь вы видите, что мой play
функция уже возвращает результат, то есть выиграл игрок или нет):
import random
def play():
won = True
keepPlaying = False
rollDice = random.choice([1,2,3,4,5,6])
if rollDice == 6:
return won
return keepPlaying
def run_game(winsA, winsB):
while True:
playA = play()
playB = play()
if playA:
winsA += 1
return winsA, winsB
elif playB:
winsB += 1
return winsA, winsB
def run_trial(numGames):
winsA = 0
winsB = 0
for i in range(numGames):
wins = run_game(winsA, winsB)
winsA = wins[0]
winsB = wins[1]
print("winsA:", winsA, "| winsB:", winsB, "| Fraction of A wins:", "{} %".format(winsA / ( winsA + winsB ) * 100))
numTrials = 10
numGames = 10000
for i in range(numTrials):
run_trial(numGames)
Вам действительно нужно только подсчитать выигрыши для игрока A. Поскольку вы играете 10000 игр за пробу, если вы знаете количество игр, которые выиграл A, вы знаете, что другие игры должны быть выиграны B, и A+B=10000.
Похоже, вы случайным образом решаете, у кого первый ход, но в задании указано, что игрок А всегда должен брать первый ход.
Вы можете использовать логическое значение isPlayerA
знать, чья это очередь. Начать с isPlayerA = True
а затем переключить его с isPlayerA = not isPlayerA
,
Вот как вы могли бы написать это:
import random
def rollDie():
return random.choice([1,2,3,4,5,6])
def winFraction(): # Perform one trial of 10000 games and return fraction of wins for A
winsA = 0 # only count wins for A
for numTrow in range(10000):
isPlayerA = True # Player A always takes the first turn
throw = rollDie()
while throw != 6: # While the game is not over yet:
isPlayerA = not isPlayerA # Switch to the other player
throw = rollDie()
if isPlayerA:
winsA += 1 # Only count the wins for player A
return winsA/10000.0 # This is the fraction: we know the number of played games
def sim():
for trial in range(10): # Perform 10 trials
print(winFraction()) # Print the result of the trial
sim() # Start the simulation