使用Python计算输出的概率

时间:2014-09-18 18:08:09

标签: 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

这成功输出了与Monopoly板上方块对应的数字列表。我的下一步是在它们的概率旁边创建这些方块的列表,使它看起来像这样:

0 = 2.01%

1 = 1.77%

2 = 1.86%

...等

我知道如何以数学方式计算这些百分比。但是,我不知道如何计算一个数字的每个实例,以便我知道除了掷骰子总数的内容。有人能指出我在正确的方向吗?

(请注意,像公益金和机会这样的方块不会影响我的Monopoly版本的移动,所以没有必要将它们纳入此程序。)

感谢您的时间

2 个答案:

答案 0 :(得分:2)

这实际上取决于您想要计算的概率。例如,如果您正在谈论P(land on square X | currently on square Y),那么您需要跟踪每一对(滚动前的起始位置和滚动后的结束位置)......但我还想指出这可以在没有模拟的情况下完成。当你知道掷骰子每个结果的概率时,它可以通过分析计算。

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

如果没有机会卡或重新指导你的事情,这是不可能的

Ex2 P(land on square 3 | currently on square 1) = 1/36

这种情况发生的唯一方法是一卷蛇眼

如果你在谈论稳态概率,我认为你是这样,我会建议你在掷骰后找到你在平方X上落下的转弯次数除以总数转而你长时间运行你的模拟(如果你制作马尔霍夫链,这实际上可以通过分析完成)

修改根据您对跟踪每个广场落入的次数的评论,我会使用字典

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]

答案 1 :(得分:2)

我假设你想要计算一个正方形在一个特定游戏实例中落下的实际比率,在给定的转数下进行。

基于原始代码,我想出了以下内容:

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%