拉盘的可能性(python)

时间:2013-03-22 03:37:25

标签: python geometry probability

使用python 3.3,我应该回答以下问题:

从一个装满光盘的盒子里,我们想知道拉两个蓝色光盘的可能性 当盒子中的所有光盘都是红色或蓝色时连续排列。写一个可以的功能 计算填充任意数量的红色圆盘和任意数量的红色圆盘的盒子的概率 蓝色光盘。您可能想要使用的测试用例:如果该框包含15个蓝色光盘和6个红色 光盘,你有50%的机会连续画两张蓝色光盘。

现在编写一个函数来计算连续绘制n个蓝色光盘的概率 一些n介于0和盒子中的光盘数量之间。

我尝试过使用这个模型

import random
def random_pick(some_list, probabilities):
    x = random.uniform(0, 1)
    cumulative_probability = 50.0
    for item, item_probability in zip(some_list, probabilities):
        cumulative_probability += item_probability
        if x < cumulative_probability: break
    return item

我几乎完全迷失了。请帮忙。

3 个答案:

答案 0 :(得分:1)

绘制单个蓝色光盘的概率等于蓝色光盘与总光盘的比例,例如,如果您有2个蓝色光盘和2个红色光盘,则有0.5个更改绘制蓝色光盘。

如果要绘制第二张光盘,由于您已经删除了一张蓝光,因此您需要使用少一张(蓝色)光盘计算概率。所以你现在有1个蓝色2红色光盘,因此1/3概率。由于这个概率取决于第一个条件,你需要乘以两个概率,即1/2 * 1/3。

一般来说:

def prob_blue_inrow(numb, numr, n): 
  p = numb / (numr + numb * 1.0)
  if (n == 1): 
    return p
  else:
    return p *  prob_blue_inrow(numb - 1, numr, n - 1)

print(prob_blue_inrow(15, 6, 2))

答案 1 :(得分:1)

对于这种情况,所有案例的枚举都不是CPU密集型的

>>> from itertools import combinations
>>> sum('r' not in x for x in combinations('b' * 15 + 'r' * 6, 2))
105
>>> sum(1 for x in combinations('b'*15+'r'*6, 2))
210
>>> 105/210.0
0.5

甚至可以在不到一秒的时间内枚举1000蓝色和1000红色。如果您将样本数增加到3表示它会表现得非常糟糕:)

答案 2 :(得分:0)

P(blue) = P(blue 1) * P(blue 2) * ... * P(blue n) 如果有15个蓝色光盘和6个红色,则总共有21个。 P(blue 1)是15/21 = .7143。现在剩下20张光盘,其中14张是蓝色的。因此,P(blue 2)是14/20 = 0.7。 0.7143 * 0.7 = 0.5

你可以重复这个,无论你需要拉多少。

在伪代码中:

probabilityOfBlue (numBlueInDeck, numRedInDeck, numBlueToPull)
  if (numBlueToPull > numBlueInDeck or numBlueToPull < 0 or (numBlueInDeck + numRedInDeck) == 0)
    return 0

  probability = 1.0
  i = 0
  while i < numBlueToPull
    probability = probability * (numBlueInDeck/(numBlueInDeck + numRedInDeck))
    numBlueInDeck = numBlueInDeck - 1
    i = i + 1

  return probability