使用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
我几乎完全迷失了。请帮忙。
答案 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