【问题标题】:Python probabilityPython 概率
【发布时间】:2017-12-24 09:43:38
【问题描述】:

我们有一个六面骰子,面数从 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

我的代码有什么问题?

【问题讨论】:

  • 先把问题写在纸上。如果您知道对数,则无需任何代码即可解决此问题。

标签: python math probability


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。终于我明白了。我想强调的另一点是 python 返回 1/6 作为 0 但如果我们将其设为 1/float(6) 它会给出正确的结果。这几乎让我发疯了
  • 是的,python 就是这样做的,当我忘记的时候很烦人。你也可以做1/6.0(或1.0/6)。使其中一个数字成为小数强制浮动
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    谢谢。请考虑其他因素。

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

    【讨论】:

      【解决方案4】:

      获得一次成功所需的伯努利试验次数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()
      

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

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

      【讨论】:

        【解决方案5】:
        def probTest(limit):
            prob = 1.0
            n = 1
            while prob > limit:
                prob =  5/6^(n-1)*1/6.0
                n += 1        
            return n
        

        【讨论】:

        • "^" 是 XOR 运算符,而不是求幂。而且,正如 cmets 中所述,5/6 在 python 中的计算结果为 0。
        【解决方案6】:
        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
        

        【讨论】:

        • 问题是prob = prob * (1/6.0)*((5/6.0)**n-1)中多了一个prob*,而n-1需要放在括号里。
        猜你喜欢
        • 2011-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 2018-11-19
        • 2016-04-12
        • 2018-01-09
        • 1970-01-01
        相关资源
        最近更新 更多