2015-11-05 164 views
0

我在Python中使用隨機模擬骰子游戲。然後我模擬遊戲的次數,看看玩家多久擊敗經銷商。我有一個帶有種子的測試文件來檢查我的代碼,但是我的數字略有偏差。我認爲錯誤在於結構,但似乎無法弄清楚究竟是什麼。模擬骰子游戲1000次

骰子輥

def quietRoll(): 
    return random.randrange(1,7) + random.randrange(1,7) 

骰子模擬

def quietCraps(): 

    #first roll 

    firstRoll = quietRoll() 
    if firstRoll in (7,11): 
     return 1 
    elif firstRoll in (2,3,12): 
     return 0 

    #every other roll 

    newDice = quietRoll() 
    while newDice not in (7, firstRoll): 
     newDice = quietRoll() 
     if newDice == firstRoll: 
      return 1 
     if newDice == 7: 
      return 0 

運行擲骰子的n倍量

def testCraps(n): 
    count = 0 
    playerWin = 0 
    while count <= n: 
     if quietCraps() == 1: 
      playerWin += 1 
      count += 1 
     else: 
      count += 1 
return playerWin/n 

預計輸出

Failed example: 

random.seed(5) 
testCraps(1000) 

Expected: 
    0.497 
Got: 
    0.414 
+0

而你的問題是...什麼? –

+0

@DavidSchwartz什麼導致期望的輸出與實際不同? – 23k

+3

你是怎麼想出你的預期產量的? – 2015-11-05 23:36:39

回答

2
newDice = quietRoll() 
while newDice not in (7, firstRoll): 
    newDice = quietRoll() 
    if newDice == firstRoll: 
     return 1 
    if newDice == 7: 
     return 0 

如果7firstRoll首次newDice的土地,你脫落的功能沒有碰到一個return語句,函數默認返回None

由於return語句結束的功能(停止功能,可以執行任何循環和跳過任何函數的其餘代碼的),你可以通過具有循環是while True和循環之前未初始化newDice解決這個問題:

while True: 
    newDice = quietRoll() 
    if newDice == firstRoll: 
     return 1 
    if newDice == 7: 
     return 0 

或者,你可以移動if檢查圈外的,所以他們發生一次的模具已經降落在7firstRoll,無論這種情況發生內或外循環:

newDice = quietRoll() 
while newDice not in (7, firstRoll): 
    newDice = quietRoll() 
if newDice == firstRoll: 
    return 1 
if newDice == 7: 
    return 0 
+0

什麼是替代方式來寫它,所以不會發生,我是一個初學者,所以我爲這個愚蠢的問題道歉。 – 23k

+0

@ 23k:答案擴展。 – user2357112