我在计算两个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)
用这段代码不能得到两个
ones
的概率。您的代码(由于while True
错误地)所做的是计算从两个独立的骰子中获得任何两个相等结果所需的尝试次数。你知道吗这个概率可以用简单的概率论来确定。为了得到任何两个相等的结果,
p = (1/36) * 6 = 1/6
。你知道吗这意味着,在两个独立骰子的每6次掷骰中,有一次你从每个骰子中得到相同的结果(例如,两个
fours
或两个sixes
)如果你想用一个算法来发现这个问题,你可以运行一个类似蒙特卡罗的模拟,看看在世界的随机状态下,这种情况预计会发生多少次。你知道吗
使用您自己的算法(稍作修改):
你会看到,正如预期的那样,模拟的数量越多,平均值就越接近6。你知道吗
另外,如果你想找到你所描述的情况的平均值(即找到两个
ones
出现的概率),你可以改变这一行(它解释了任何两个相等的数)对于以下情况(仅说明输出为
one
的情况):然后,你可以跑去找那个
和预期的一样,接近
36
。你知道吗请注意,如果绘制结果的直方图,结果将不会遵循正态分布:
这是因为你在分析
X*Y
等于1的概率,X*Y
是两个高斯随机变量的乘积。因此,X*Y
的分布不是正态分布,而是遵循这两个变量的product distribution(参见here)不管你掷多少次骰子,概率都是一样的。1/36. 1有利结果除以36个可能结果。多次掷骰子来计算它最终看起来更像一个Bell Curve。如果这是你想要的,数数你得到21的次数,除以范围。你知道吗
编辑:添加代码
相关问题 更多 >
编程相关推荐