0

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

从一个装满棋子的盒子中,我们想知道当盒子里的所有棋子都是红色或蓝色时,连续拉出两个蓝色棋子的概率。编写一个函数,计算一个装满了任意数量的红色圆盘和任意数量的蓝色圆盘的盒子的概率。一个你可能想要使用的测试用例:如果盒子里有 15 个蓝色圆盘和 6 个红色圆盘,你有 50% 的机会连续抽出两个蓝色圆盘。

现在编写一个函数,计算在 0 和盒子中的圆盘数量之间的某个 n 连续绘制 n 个蓝色圆盘的概率。

我试过用这个模型

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

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

4

3 回答 3

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))
于 2013-03-22T03:47:10.147 回答
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,它的表现会非常糟糕:)

于 2013-03-22T04:17:42.833 回答
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
于 2013-03-22T03:41:55.340 回答