两个骰子的Python概率骰子游戏

2024-10-01 15:45:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在下面的函数上重复1000次,看看你在这个游戏中是赢了还是亏了钱。在

这个游戏是这样设计的,你扔一对骰子,然后拿回钱或是零花钱。假设我们从5个硬币开始。在

掷一个12得到1.5硬币。在

投掷一枚11金币。在

投掷10得到0.5硬币。在

抛出一个9、8或7不会产生任何结果。在

投掷一个6,5,4,3,2或1会从您的硬币数量中扣除0.5硬币。在

到目前为止,我的实现是这样的:

def luckCalc():

    amount = 5

    # if 12 then 1/36 chance

    if random.randrange(1,7) == 6 and random.randrange(1,7) == 6:
        amount = amount + 1.5

    # if 11 then 2/36 chance
    elif  (random.randrange(1,7) == 5 and random.randrange(1,7) == 6) or (random.randrange(1,7) == 6 and random.randrange(1,7) == 5):
        amount = amount + 1

   # if 10 then 3/36 chance

   elif (random.randrange(1,7) == 5 and random.randrange(1,7) == 5) or (random.randrange(1,7) == 4 and random.randrange(1,7) == 6) or (random.randrange(1,7) == 6 and random.randrange(1,7) == 4):
       amount = amount + 0.5

   # if 9,8,7
   # 4/36 + 5/36 + 6/36 chance
   # 1+6, 2+5, 3+4, 4+3, 5+2, 6+1 chance
   # 2+6, 3+5, 4+4, 5+3, 6+2 chance
   # 3+6, 4+5, 5+4, 6+3 chance
   # then no change in amount 

   # if 6,5,4,3,2,1
   # chances...
   # then amount -0.5

return amount 

# Iterate over the dice throwing simulator and calculate total

total = 0.0
for a in range(1000):
    total = total + luckCalc()

print (total)

在函数的末尾我停止了编码,因为我意识到必须有一个更优雅的解决方案来实现这一点。有什么有趣的建议,我一直听说的蒙特卡洛是什么?在


Tags: orand函数in游戏if硬币random
3条回答

我注意到你的代码中有一些东西。首先,对于6-1的情况,你实际上并没有从数量中减去0.5。第二,由于你没有传递每个循环的初始量,所以你将5到6.5加到你的总数中,这使得总数变得毫无意义。在

一个更有效的总额将是每次都将金额转入:

def luckCalc( amount ):

然后你的循环:

^{pr2}$

Blender的答案,在我写这篇文章的时候发布的,是一个很好的简化你的主要功能的方法。在

每次调用random.randrange(1,7),都会生成一个新的随机数。既然你测试的是一个“转身”,那么掷两次:

def roll_die():
    return random.randrange(1, 7)

total = roll_die() + roll_die()

看看总和是否在一个范围内:

^{pr2}$

以下是10万发子弹的结果:

>>> from collections import Counter
>>> counts = Counter(play_turn() for i in xrange(100000))
>>> counts
    Counter({-0.5: 41823, 0: 41545, 0.5: 8361, 1.0: 5521, 1.5: 2750})
>>> probabilities = {score: count / 100000.0 for score, count in counts.items()}
>>> probabilities
    {-0.5: 0.41823, 0: 0.41545, 0.5: 0.08361, 1.0: 0.05521, 1.5: 0.0275}

你真的可以滚(哈!)你所做的一切都集中在一个功能中:

from random import randrange

def play_game(rolls=1000, amount=5, n=6):
    """Play game 'rolls' times, starting with 'amount' on 'n'-sided dice.""" 
    for i in range(rolls):
        roll = randrange(1, n+1) + randrange(1, n+1)
        if roll == 12:
            amount += 1.5
        elif roll == 11:
            amount += 1
        elif roll == 10:
            amount += 0.5
        elif roll < 7:
            amount -= 0.5
    return amount

相关问题 更多 >

    热门问题