Python概率alg

2024-04-26 10:08:07 发布

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

我在计算两个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)

Tags: ofnumberreturncountrangerandomdice概率
2条回答

用这段代码不能得到两个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

不管你掷多少次骰子,概率都是一样的。1/36. 1有利结果除以36个可能结果。多次掷骰子来计算它最终看起来更像一个Bell Curve。如果这是你想要的,数数你得到21的次数,除以范围。你知道吗

编辑:添加代码

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

相关问题 更多 >