3

我们有一个六面骰子,面数从 1 到 6。在第 n 次掷骰上第一次看到 1 的概率随着 n 的增加而降低。我想找到最小的掷骰数,以使该概率小于某个给定的限制。

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

我的代码有什么问题?

4

6 回答 6

7

在第 n 次掷骰的概率是 5/6^(n-1)*1/6,而不是 1/6^n。1/6^n 是在所有n 卷
上滚动一个的概率。

前 n-1 个掷骰各有 5/6 的机会不是一个。
第 n 次滚动有 1/6 的机会成为 1。

于 2012-12-09T06:52:23.620 回答
2

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

于 2012-12-09T14:08:39.763 回答
1

谢谢。请考虑其他因素。

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

于 2012-12-09T17:02:49.703 回答
0

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

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()

在此处输入图像描述

我们也可以使用模拟来找到概率,如下所示:

import numpy as np
sim_geom = np.random.geometric(p=p, size=1000)
import seaborn as sns   
sns.distplot(sim_geom)
plt.show()

在此处输入图像描述

于 2017-02-13T05:33:46.750 回答
-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
于 2012-12-09T11:52:50.503 回答
-1
def probTest(limit):
    prob = 1.0
    n = 1
    while prob > limit:
        prob =  5/6^(n-1)*1/6.0
        n += 1        
    return n
于 2012-12-09T12:49:07.747 回答