Python概率算法

Python概率算法,python,algorithm,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 x

我试图计算两个骰子掷两个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)

无论你掷骰子多少次,概率都是一样的。1/36. 1有利结果除以36个可能结果。多次掷骰子来计算,结果看起来更像是一场赌博。如果这是您想要的,则计算得到2 1s的次数并除以范围

编辑:添加代码

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

用这个代码你不可能得到两个一的概率。由于while True,您的代码错误地计算了从两个独立的骰子中获得任意两个相等结果所需的尝试次数

这个概率可以用简单的概率论来确定。你可以得到任意两个相等的结果,p=1/36*6=1/6

这意味着,在两个独立骰子的每6次掷骰中,有一次你会从每个骰子中得到相同的结果,例如2个4或2个6

如果你想通过一个算法来发现,你可以运行一个类似蒙特卡罗的模拟,看看在世界的随机状态下,预计会发生多少次投掷

使用您自己的algo进行一些小的修改:

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

此外,如果你想找到你描述的案例的平均值,也就是说,找到两个数字出现的概率,你可以改变这条线,它可以解释任意两个相等的数字

对于以下仅说明输出为1的情况:

然后,你可以跑去找到它

>>>  np.array(z).mean()
35.8479
这与预期的接近36

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


这是因为你在分析X*Y等于1的概率,X*Y是两个高斯随机变量的乘积。因此,X*Y的分布不是正态分布,但将遵循这两个变量在收益表中的参考值

,看到了多少有利的结果,以及有多少可能的结果?代码中的什么检测到“有利”结果?巴尼人回答说:“根据你试图计算的结果,它能正确地做到这一点吗?谢谢你,你是说总计数/范围吗?是的,双1/范围的总计数。”。但不要期望它接近1/36。这在理论上是正确的,但我们是在实验上解决这个问题吗?@khepu我知道这不会精确,但至少我可以调整范围使其接近,所以total_count/range给了我一个整数,我该如何把它变成一个整数percentage@RafaelC是的,你是对的,我确实想到了这一点,但为时已晚。这很好,因为在原始代码中,它没有寻找d1和d2都是一个实例;它只是看d1和d2是否相同。@RafaelC这是一个错误。我把我的条件改为d1==1和d2==1。我不认为这完全符合你所说的预期转鼓数是6,因为转鼓的概率是1/6,尽管这个结论是正确的。看起来你在非正式的意义上使用了预期,然后在统计意义上总结了一些关于预期的东西。我想你需要写下并求解方程E=1/6+E+15/6,或者计算出和。或者也许我缺少了你的一些直觉。@PaulHankin你确实是对的,但你的表达基本上证明了我那无可否认的糟糕措辞背后的直觉。如果我们计算你的无穷和,我们会发现结果是1/p,对于任何一个p,| 1-p|
if d1 == d2 and (d1==1):
>>>  np.array(z).mean()
35.8479