Python概率算法

时间:2018-06-03 18:37:17

标签: python algorithm

我正在尝试计算两个1的滚动两个骰子的概率。我知道概率公式是

# Probability of an Event =  Number of Favorable Outcomes Total / Number of Possible Outcomes

我能够在算法上提出解决方案,但无法在return语句中明确表达公式。我将如何使用此解决方案来解决这个问题

import random 

def roll_dice(n, range):

    total_count = 0

    for i in xrange(range):

        while True:

            total_count +=1

            d1, d2 = random.randint(1,n), random.randint(1,n)

            if d1 == d2:
                break

    return #probability

print roll_dice(6, 1000)

2 个答案:

答案 0 :(得分:1)

无论你掷骰子多少次,概率都是一样的。 1/36。 1个有利的结果除以36个可能的结果。多次掷骰子来计算它最终看起来更像是Bell Curve。如果这就是你想要的数量,你得到2 1并除以范围。

编辑:添加代码

def roll_dice(n, range):
     total_count = 0

    for i in xrange(range):
        d1, d2 = random.randint(1,n), random.randint(1,n)
        if d1 == 1 and d2 == 1:
            total_count+=1

return total_count/range

答案 1 :(得分:1)

您无法获得使用此代码获得两个ones的概率。您的代码(错误地,由于while True)所做的是计算需要多少次尝试才能从获取任何两个相同的结果独立的骰子。

这个概率可以用简单的概率论来确定。为了获得任何两个相同的结果,p = (1/36) * 6 = 1/6

这意味着,预计在两个独立骰子的每6次投掷中,一旦发生,你从每个骰子得到相同的结果(例如两个fours或两个sixes

如果您想通过算法找到它,您可以运行类似蒙特卡罗的模拟,以查看在随机世界状态下预计会发生多少次抛出。

使用你自己的算法(经过一些小修改):

import random 

def roll_dice(n, arange):

    total_count = 0

    for i in range(arange):
        total_count +=1
        d1, d2 = random.randint(1,n), random.randint(1,n)
        if d1 == d2:
            break

    return total_count

z=[]
s=1000
for i in range(s):
    z.append(roll_dice(6, 1000))

>>> np.array(z).mean()
5.916666666666667

# s=100000
>>> np.array(z).mean()
5.9943

您可以看到,正如预期的那样,模拟次数越多,预计平均值越接近6。

此外,如果你想找到你所描述的案例的平均值(即找出两个ones出现的概率),你可以改变这一行(它代表任意两个相同的数字)

if d1 == d2:

表示以下内容(仅考虑输出为one的情况):

if d1 == d2 and (d1==1):

然后,您可以运行并找到

>>>  np.array(z).mean()
35.8479

接近36,正如所料。

请注意,如果您绘制结果的直方图,结果将不会遵循正态分布: enter image description here

这是因为您正在分析X*Y等于1的概率,X*Y是两个高斯随机变量的乘积。因此,X*Y的分布不正常,但会遵循这两个变量的 product distribution (参考here