2014-09-18 44 views
1

我目前使用Python來創建一個程序,它將計算壟斷委員會每個廣場上的着陸概率。到目前爲止,我想出了這個代碼:使用Python來計算輸出的概率

def monopoly(turns): 
    square = 0 
    allsquares = [] 
    while turns > 0: 
     roll = randrange(1,7) + randrange(1,7) 
     square = square + roll 
     if square > 39: 
     square = square % 39 
     if square == 30: 
     square = 10 
     allsquares.append(square) 
     turns = turns - 1 
    return allsquares 

這成功地輸出對應的大富翁遊戲的平方數的列表。我的下一步是創建這些正方形的名單及其概率旁邊,所以它看起來是這樣的:

0 = 2.01%

1 = 1.77%

2 = 1.86%

...等。

我知道如何從數學上計算這些百分比。但是,我不確定如何計算每個數字的實例,以便我知道除了擲骰子的總數還有什麼區別。有人能在這裏指出我正確的方向嗎?

(請注意,像公益金和機遇廣場並不影響我的版本專賣的運動,所以沒有必要將它們因素納入這一計劃。)

感謝您的時間

回答

2

的次數我假設你要計算的實際比例,作爲quare在特定的比賽中落地,在給定的轉數上進行。在你原來的代碼

大廈,這裏是我想出了:

from __future__ import division # for getting a float result from int division 
from collections import defaultdict 
from random import randrange 

TURNS = 150 

def monopoly(turns): 
    square = 0 
    allsquares = defaultdict(lambda: 0) 
    while turns > 0: 
     roll = randrange(1,7) + randrange(1,7) 
     square = square + roll 
     if square > 39: 
      square = square % 40 # this should be modulo 40 since there are 40 squares 
     if square == 30: 
      square = 10 
     allsquares[square]+=1 
     turns = turns - 1 
    return allsquares 

allsquares = monopoly(TURNS) 
print "The actual ratio for landing on each square in %d turns for this particular game instance was:" % (TURNS,) 
for i in xrange(40): 
    print "square %d - %.2f%%" % (i, 100 * allsquares[i]/TURNS) 

正如你可以看到,主要的變化保持降落廣場的得分在defaultdict(爲0的默認值)而不是在list中,以支持輕鬆計數。將項目存儲在list中將迫使我們遍歷列表以便計算每個方塊實例(儘管這可以通過collections.Counter輕鬆完成)。

請注意,您的原始腳本包含而致無法降落在廣場0的錯誤,因爲模製成模39而非模40

執行程序給出了這樣的輸出:

The actual ratio for landing on each square in 150 turns for this particular game instance was: 
square 0 - 1.33% 
square 1 - 1.33% 
square 2 - 2.00% 
square 3 - 2.67% 
square 4 - 3.33% 
square 5 - 0.00% 
square 6 - 5.33% 
square 7 - 1.33% 
square 8 - 2.67% 
square 9 - 2.00% 
square 10 - 4.67% 
square 11 - 2.67% 
square 12 - 2.67% 
square 13 - 1.33% 
square 14 - 6.00% 
square 15 - 4.00% 
square 16 - 1.33% 
square 17 - 1.33% 
square 18 - 2.67% 
square 19 - 4.00% 
square 20 - 4.00% 
square 21 - 4.00% 
square 22 - 2.00% 
square 23 - 2.67% 
square 24 - 1.33% 
square 25 - 0.67% 
square 26 - 2.00% 
square 27 - 2.67% 
square 28 - 4.67% 
square 29 - 4.00% 
square 30 - 0.00% 
square 31 - 1.33% 
square 32 - 2.00% 
square 33 - 2.67% 
square 34 - 2.00% 
square 35 - 1.33% 
square 36 - 3.33% 
square 37 - 1.33% 
square 38 - 3.33% 
square 39 - 2.00% 
+0

這是絕對優秀的答案。謝謝你的幫助! – Zetland 2014-09-19 15:06:48

+0

@Zetland,我很高興這個答案證明是有益的:-)請考慮[up-voting](http://meta.stackexchange.com/q/173399)它和所有其他答案,你發現有幫助,通過點擊每個答案左邊的大箭頭。此外,請考慮[接受](http://meta.stackexchange.com/q/5234/179419)它或任何其他解決您的問題的答案,方法是單擊首選答案左側的複選標記。請注意,儘管您可以對多個答案進行投票,但您只能接受一個答案。絕對沒有義務做任何這些。 – Yoel 2014-09-19 21:42:15

+0

謝謝,我提出了兩個答案,雖然我不確定我是否有足夠的經驗來將一個答案標記爲「正確」答案。在您評論之後,我會盡力的。 – Zetland 2014-09-22 12:53:42

2

這真的取決於你想計算什麼樣的概率。例如,如果你在談論P(land on square X | currently on square Y),那麼你需要跟蹤每一對(開始之前的位置和結束後的位置)...但我也想指出,這可以沒有模擬就可以完成。當你知道擲骰子的每個結果的概率時,可以通過分析計算。

練習1 P(land on square 25 | currently on square 1) = 0

這是沒有機會卡或東西,不可能重新引導您

練習2 P(land on square 3 | currently on square 1) = 1/36

出現這種情況是眼睛蛇一卷

如果只有這樣,你在談論一個穩態概率,我認爲你是這樣的,我會建議尋找你在平方上落後的回合數,然後除以你把和運行仿真時間長匝總數(如果你犯了一個Markhov鏈這實際上可以做分析以及)

編輯根據您保存的每個次數的軌道評論廣場上降落在我會用字典

from collections import defaultdict 
allsquares = defaultdict(int) #this makes the default value of the dictionary 0 

#...whenever a square is landed on 
allsquares[square] += 1 #increments that entry in the dictionary by 1 

要檢查你降落在廣場5例如

print allsquares[5] 
+0

這是正確的。所以,如果我想知道在1號廣場登陸的機率,我會有一個公式:#我在1 /總卷數上落地。 但是,我正在努力的是累計每個廣場落地的次數。你有可能知道如何做到這一點? – Zetland 2014-09-18 18:31:54

+0

@Zetland請參閱編輯我的答案,以計算您在任何特定廣場上登陸的次數 – sedavidw 2014-09-18 18:39:34