【问题标题】:monte carlo of a preexisting program现有程序的蒙特卡罗
【发布时间】:2018-07-30 08:38:07
【问题描述】:

diceGame.py(如下)中的 Python 代码包含我们在课堂上讨论的骰子游戏的 Python 实现。假设我们运行代码 N 次并根据 A 发生的次数除以 N 来估计某个事件 A 的概率 P r{A}。然后我们重复这个过程 M 次收集概率 pi, i = 1 , . . . , M. 假设两个骰子都是公平的,修改 diceGame.py 的主程序,使用 N = 10, 100, 1000 和 M = 100 获得以下概率:

第一次掷骰子时获胜的概率。

如果第一次掷出 4,则赢得比赛的概率。

赢得比赛的概率。

游戏需要超过 5 次掷骰的概率。

我知道所有这些答案都可以通过代码本身轻松提供。我的问题是我不知道如何编辑 python 代码来提供这些所需的输出。

代码如下:

# ===============================
# IMPORTS RANDOM NUMBER GENERATOR
# ===============================
import random

# ================================================================
# GENERATES RANDOMLY THE SUM OF TWO INTEGERS IN THE [1,6] INTERVAL
# ================================================================
def rollDices():
  return int(random.randint(1,6) + random.randint(1,6))

# ================================================
# RETURN THE OUTCOME STRING GIVEN AN INTEGER STATE
# ================================================
def getOutcome(outcome):  
  if(outcome == 0):
    result = "Lost at first roll."
  elif(outcome == 1):
    result = "Won at first roll."
  elif(outcome == 2):
    result = "Won on [4,5,6,8,9,10]"
  elif(outcome == 3):
    result = "Lost on [4,5,6,8,9,10]"
  return result

# ==============
# PLAYS THE GAME
# ==============
def playGame():

  # Define Variables
  gameFinished = False
  wonGame = False
  totRolls = 0

  while (not(gameFinished)):

    # ROLL DICES
    totScore = rollDices()
    totRolls += 1;

    # GAME IS LOST
    if(totScore in [2,3,12]):
      gameFinished = True
      wonGame = False
      return 0,wonGame,totRolls,totScore

    # GAME IS WON
    if(totScore in [7,11]):
      gameFinished = True
      wonGame = True
      return 1,wonGame,totRolls,totScore

    # JUST CONTINUE PLAYING
    if(totScore in [4,5,6,8,9,10]):      

      # REPEAT UNTIL YOU FIND THE SCORE AGAIN OR 7
      newScore = 0
      while((newScore != totScore)and(newScore != 7)):

        newScore = rollDices()
        totRolls += 1;

        # CHECK IF YOU WIN OR LOOSE
        if(newScore == totScore):
          gameFinished = True
          wonGame = True
          return 2,wonGame,totRolls,totScore

        if(newScore == 7):
          gameFinished = True
          wonGame = False
          return 3,wonGame,totRolls,totScore

# ============
# MAIN PROGRAM
# ============
if __name__ == "__main__":

  intVal,wonGame,numRolls,lastScore = playGame()

  print("Outcome: %s" % (getOutcome(intVal)))
  if(wonGame):
    print("You have won the game.")
  else:
    print("You have lost the game.")
  print("Total rolls needed for this game: %d" % (numRolls))
  print("Last outcome: %d" % (lastScore))

我尝试解决问题时的新主要功能:

if __name__ == "__main__":
    m = 100
    n = 10
    FRwins = 0
    for i in range(m):
        for j in range(n):
            intVal,wonGame,numRolls,lastScore = playGame()
            if getOutcome(intVal) == 1:
                FRwins += 1
        FRwins = FRwins/float(n)
        print(FRwins)

【问题讨论】:

  • @Evert 我已经做出了您推荐的更改。

标签: python python-3.x random dice


【解决方案1】:

目前这个程序正在玩一次游戏。如果您查看最后 10 行代码,这就是您想要调整的内容。重要的一行是:

intVal,wonGame,numRolls,lastScore = playGame()

它只被调用一次,所以你只能得到一个结果。由于您需要进行蒙特卡罗模拟(即一遍又一遍地播放并跟踪概率),因此您只需多次重播这条线,并每次都跟踪结果。

从那里,您将需要设置一些 for 循环,例如:

for i in range(m):

并跟踪每次模拟的结果。由于您正在使用 m 和 n,因此您将需要围绕 playGame() 的嵌套循环。然后,您只需随时计算结果,然后除以总尝试次数即可得出您的概率。

希望这会有所帮助。随意提出更多问题 - 我试图让它足够笼统,以至于我实际上并没有为你的家庭作业编写代码!

【讨论】:

  • 太棒了!这肯定会让我朝着正确的方向前进。我一定会让你知道我的尝试进展如何。
  • 好的,我已经遇到了问题。我参加这门课很晚,所以我基本上错过了他们所涵盖的所有 python。我在今年 1 月之前没有编码经验,所以这对我来说都是全新的。我已将 main 函数更改为 if name == "main": m = 100 n = 10 FRwins = 0 for i in range(m): for j in range(n): intVal,wonGame,numRolls,lastScore = playGame() 如果结果 == 1; FRwins += 1; FRwins = FRwins/float(n) print(FRwins) 我的方向正确吗?
  • 由于最后一条评论不太可读,我将在原始问题中发布我的新主程序作为编辑。到目前为止,它绝对是不完整的,但我没有收到任何错误。它给了我大量的 0.0 秒作为输出。我认为这是因为我的 FRwins 计数器没有按预期工作
  • 听起来不错...将其更新为您的原始帖子,我将能够更好地看到它。 Python 是关于格式化和空格的,所以如果没有它,很难检查你的工作方式。虽然到目前为止,总体思路还是不错的。不过,一旦我看到你的帖子,我有一些想法给你。
  • 不确定通知等如何在这里工作,所以我只是评论让您知道我已经编辑了问题,以便您可以查看代码。抱歉,如果您已经看到了,只是想确定一下。
猜你喜欢
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2018-07-02
  • 2020-05-18
  • 2023-03-02
  • 2019-10-07
相关资源
最近更新 更多