2016-11-05 5 views
0

для решения этой проблемы:биномиальное распределение вероятностей в питона

Соотношение мальчиков и девочек для детей, рожденных в России 1,09: 1 Если есть один ребенок, родившийся за рождения, какова доля российских семей именно с 6 детьми будет есть как минимум 3 мальчика? Написать программу для вычисления ответа с использованием указанных выше параметров: Одна строка, содержащая следующие значения:

1,09 1

это моя программа:

pp=str(input()) 
p1=float(pp[:pp.find(' ')]) 
p2=float(pp[pp.find(' ')+1:]) 
pf=0.0 
pa=0.0 
from math import factorial as f 
def comb(n,r): 
    return f(n)/f(r)/f(n-r) 
for i1 in range(1,7): 
    if i1>=3: 
     pf=pf+(pow(p1,i1)+pow(p2,6-i1))*comb(6,i1) 
    pa=pa+(pow(p1,i1)+pow(p2,6-i1))*comb(6,i1) 
print("%.3f"%(pf/pa)) 

ответ Ive получил это 0,688 где правильный ответ 0.696, в чем проблема в моем коде?

+0

В чем смысл этих переменных? Также: вы принимали во внимание, что в семьях могут быть дети * 0 * для мужчин? Ваш цикл 'for' начинается с' 1', поэтому может возникнуть небольшая ошибка. – Bakuriu

+0

pa - полная вероятность, а pf - вероятность цели, p1 - вероятность мальчиков, а p2 для девочек, после фиксации для начальной точки теперь я получаю 0.679 еще не правильный. –

+0

Самая вопиющая ошибка в вашем коде, для меня, есть в математике: 1.09 и 1 - это не вероятности. – ShreevatsaR

ответ

3

Вам необходимо вычислить вероятность:

from math import factorial as f 
b, g = map(float, input().split()) 
p = b/(b+g) 
def comb(n, r): 
    return f(n)/(f(r) * f(n-r)) 
n = 6 
sum(p**k * (1-p)**(n-k) * comb(n, k) for k in range(3, 7)) 
# 0.6957033161509107 
+0

Я думаю, вам нужно 'raw_input', верно? – ShreevatsaR

+2

Не для py3 (это то, что я использую), вы правы, если используете py2. – AChampion

0
#Your input 
pp=str(input()) 
p1=float(pp[:pp.find(' ')]) 
p2=float(pp[pp.find(' ')+1:]) 
pf=0.0 
#This is the probability of boy 
p = p1/(p1+p2) 
from math import factorial as f 
def comb(n,r): 
    return f(n)/f(r)/f(n-r) 

#You have to sum the probabilities of 3,4,5 or 6 boys 
for i1 in range(3,7): 
    #You were not using the right formula (it's a multiplication, not a sum) 
    prob_i1 = pow(p,i1)*pow(1-p,6-i1)*comb(6,i1) 
    pf += prob_i1 
print("%.3f"%(pf)) 
0

Я исправил свои проблемы кода: 0 цикл запуска вместо 1 и * вместо + в пФ сумму:

pp=str(input()) 
p1=float(pp[:pp.find(' ')]) 
p2=float(pp[pp.find(' ')+1:]) 
pf=0.0 
pa=0.0 
from math import factorial as f 
def comb(n,r): 
    return f(n)/f(r)/f(n-r) 
for i1 in range(0,7): 
    if i1>=3: 
     pf=pf+(pow(p1,i1)*pow(p2,6-i1))*comb(6,i1) 
    pa=pa+(pow(p1,i1)*pow(p2,6-i1))*comb(6,i1) 
print("%.3f"%(pf/pa)) 

Теперь вывод правильный, но оба ответа лучше, чем мой путь. извините за мой сложный код, спасибо за помощь.