骰子游戏模拟

时间:2018-12-08 11:51:53

标签: python python-3.x montecarlo dice stochastic

我对作业有这个问题:

  

您的朋友设计了一个有两个玩家的游戏。两位选手   称为A和B,轮流滚动一个普通的六边形模具,其中A为   第一个开始。

     

第一个掷出6的玩家赢得比赛。   您和您的朋友不同意A获胜的概率   游戏,因此您决定使用   电脑。

     

因此:编写一个执行10个试验的Python程序,每个试验包括   10000场比赛,并且每次审判都印制出   玩家A。

这是到目前为止我得到的代码,每次都只是在1667年左右返回一个数字。我主要是想知道如何区分赢得比赛的A或B。

任何帮助将不胜感激!

编辑代码

    setInterval(() => 
        fetch('/api/dedicated-server/{{ object.id }}/')
            .then(response => response.json())
            .then(json => {
                this.dedicated_server = json;
            }),
        5000);

2 个答案:

答案 0 :(得分:0)

获得清晰代码的最佳方法是将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)

答案 1 :(得分:0)

您实际上只需要计算玩家A的获胜次数。由于您每次尝试玩10000场比赛,因此,如果您知道A赢了的游戏数,那么您就知道B必赢了其他游戏,并且A + B = 10000。

您似乎是随机决定谁拥有第一回合,但任务指出,应该始终是玩家A进行第一回合。

您可以使用布尔值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