Python概率

3
我们有一个六面骰子,面上的数字从1到6编号。 当n增加时,第一次掷出1的概率会降低。 我希望找到掷骰子的最小次数,以便使这个概率小于某个给定的限制。
def probTest(limit):
    prob = 1.0
    n = 1
    while prob > limit:
        prob = (1/6)**n
        n += 1        
    return n-1

我的代码有什么问题?


首先在纸上制定问题。如果你懂对数,你可以不用任何代码解决这个问题。 - Colonel Panic
6个回答

7
在第n次掷骰子中摇出1的概率是 5/6^(n-1)*1/6,而不是 1/6^n。
1/6^n 是在所有 n 次掷骰子中都摇出1的概率。
前 n-1 次掷骰子每次都有 5/6 的几率不会摇出1。
第 n 次掷骰子有 1/6 的几率会摇出1。

非常感谢。我终于明白了。我想强调的另一点是,Python将1/6返回为0,但如果我们将其设置为1/float(6),它会给出正确的结果。这几乎让我发疯了。 - Jamol
2
是的,Python可以做到这一点,当我忘记时很烦人。您还可以执行1/6.0(或1.0/6)。将其中一个数字转换为小数会强制转换为浮点数。 - Jeff

2
正确的做法是:prob = (5.0/6)**(n-1)*1/6.0

1

谢谢。请考虑其他因素。

probTest(25/216.0) 返回的结果是4,而不是正确的n=3。


0

得到一次成功所需的伯努利试验次数 X 的概率分布遵循几何分布 (https://en.wikipedia.org/wiki/Geometric_distribution),我们可以使用以下公式直接计算给定 p 时,X=n 的相应概率:

p = 1./6 # prob of successes
geom_prob = []
for n in range(1,25):
    geom_prob.append((1-p)**(n-1)*p) 
print geom_prob 
# [0.16666666666666666, 0.1388888888888889, 0.11574074074074076, 0.09645061728395063, 0.08037551440329219, 0.06697959533607684, 0.05581632944673069, 0.04651360787227558, 0.038761339893562986, 0.032301116577969156, 0.02691759714830763, 0.022431330956923026, 0.018692775797435855, 0.015577313164529882, 0.012981094303774901, 0.010817578586479085, 0.009014648822065905, 0.0075122073517215875, 0.006260172793101323, 0.005216810660917769, 0.0043473422174314744, 0.003622785181192896, 0.0030189876509940797, 0.002515823042495067]
import matplotlib.pyplot as plt
plt.plot(geom_prob)
plt.xlabel('n')
plt.ylabel('probability')
plt.title('Probability of getting first head on nth roll of a die')
plt.show()

enter image description here

我们也可以使用模拟来计算概率,例如下面这样:
import numpy as np
sim_geom = np.random.geometric(p=p, size=1000)
import seaborn as sns   
sns.distplot(sim_geom)
plt.show()

enter image description here


-1
def probTest(limit):
    n=1
    prob = 1.0
    while prob > limit:
        prob = prob * (1/6.0)*((5/6.0)**n-1)
        n +=1
    return n-1

2
问题在于 prob* 多余了,应该改为 prob = prob * (1/6.0)*((5/6.0)**(n-1)),同时需要将 n-1 加上括号。 - President James K. Polk

-1
def probTest(limit):
    prob = 1.0
    n = 1
    while prob > limit:
        prob =  5/6^(n-1)*1/6.0
        n += 1        
    return n

2
“^”是XOR运算符,而不是指数。正如评论中所指出的,在Python中,5/6的计算结果为0。 - President James K. Polk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接