Probabilidade de algo acontecer pelo menos n vezes em m


11

Escreva um programa ou função que, com uma probabilidade de sucesso p , um número n e um número de tentativas m retorne a chance de pelo menos n sucessos de m tentativas.

Sua resposta deve ser precisa com pelo menos 5 dígitos após o decimal.

Casos de teste:

 0.1, 10, 100 -> 0.54871
 0.2, 10, 100 -> 0.99767
 0.5, 13,  20 -> 0.13159
 0.5,  4,   4 -> 0.06250
0.45, 50, 100 -> 0.18273
 0.4, 50, 100 -> 0.02710
   1,  1,   2 -> 1.00000
   1,  2,   1 -> 0.00000
   0,  0,   1 -> 1.00000
   0,  0,   0 -> 1.00000
   0,  1,   1 -> 0.00000
   1,  1,   0 -> 0.00000

3
Você gostaria de incluir uma fórmula para aqueles que não estudaram a distribuição binomial?
Leaky Nun

2
@KennyLau Desculpe, isso faz parte do desafio.
orlp

Respostas:


3

Geléia , 15 14 bytes

2ṗ’S<¥ÐḟCạ⁵P€S

m , n e p (nessa ordem) como argumentos da linha de comando. Experimente online!

Observe que essa abordagem requer tempo e memória de O (2 m ) , portanto, não é suficientemente eficiente para os casos de teste em que m = 100 . Na minha máquina, o caso de teste (m, n, p) = (20, 13, 0,5) leva aproximadamente 100 segundos. Requer muita memória para o intérprete online.

Como funciona

2ṗ              Cartesian product; yield all vectors of {1, 2}^n.
  ’             Decrement, yielding all vectors of {0, 1}^n.
      Ðḟ        Filter; keep elements for which the link to the left yields False.
     ¥          Combine the two links to the left into a dyadic chain.
   S              Sum, counting the number of ones.
    <             Compare the count with n. 
        C       Complement; map z to 1 - z.
         ạ⁵     Compute the absolute difference with p.
           P€   Compute the product of each list.
             S  Compute the sum of all products.


6

R, 32 31 bytes

function(p,n,m)pbeta(p,m,1+n-m)

editar - 1 byte alternando para a distribuição beta (nas linhas da resposta do @ Sp3000 Mathematica)


3

Python, 57 bytes

f=lambda p,n,m:m and(1-p)*f(p,n,m-1)+p*f(p,n-1,m-1)or n<1

A fórmula recursiva para os coeficientes binomiais, exceto o caso base, m==0indica se o número restante de sucessos necessários né não-negativo, com True/Falsepara1/0 . Por causa de sua árvore de recursão exponencial, isso interrompe grandes entradas.


Para testar esta resposta em casos grandes, adicione o cache usando from functools import lru_cache; f = lru_cache(None)(f).
Orlp

@orlp Obrigado, confirmei os grandes casos de teste.
Xnor 03/03

3

Haskell, 73 bytes

g x=product[1..x];f p n m=sum[g m/g k/g(m-k)*p**k*(1-p)**(m-k)|k<-[n..m]]

3

MATLAB, 78 71 bytes

Guardado 7 bytes graças a Luis Mendo!

@(m,k,p)sum(arrayfun(@(t)prod((1:m)./[1:t 1:m-t])*p^t*(1-p)^(m-t),k:m))

ans(100,10,0.1)
0.5487

A função arrayfun não é divertida, mas não encontrei uma maneira de me livrar dela ...



1

Pitão, 20 bytes

JEKEcsmgsm<O0QKJCGCG

Experimente online!

Nota: CG é um número muito grande que o intérprete não pode manipular. Portanto, o número de tentativas foi reduzido para ^ T3, que é mil. Portanto, o link produz um resultado impreciso.

Usa abordagem probabilística pura.


Eu não acho que uma abordagem probabilística seria válido para esta questão, mas nós teria que perguntar @orlp
SP3000

Você precisa da ordem de 1 / c ^ 2 para ter precisão c com alta probabilidade, de modo que seria ~ 10 ^ 10 para cinco casas decimais.
xnor

CG é um número muito grande. De fato, é a string "abc ... z" convertida de base-256 para decimal.
Leaky Nun

2
Se "probabilístico" significa aleatório, você não pode garantir um valor preciso, independentemente de quantas realizações você calcule. De fato, o resultado é sempre diferente.
Luis Mendo

2
Sempre há uma probabilidade diferente de zero de que o resultado não seja preciso com 5 casas decimais. Portanto, ele não cumpre o requisito. Sua resposta deve ser precisa com pelo menos 5 dígitos.
Luis Mendo

1

JavaScript (ES7), 82 bytes

(p,n,m)=>[...Array(++m)].reduce((r,_,i)=>r+(b=!i||b*m/i)*p**i*(1-p)**--m*(i>=n),0)

Salvo 1 byte usando reduce! Explicação:

(p,n,m)=>               Parameters
 [...Array(++m)].       m+1 terms
  reduce((r,_,i)=>r+    Sum
   (b=!i||b*m/i)*       Binomial coefficient
   p**i*(1-p)**--m*     Probability
   (i>=n),              Ignore first n terms
   0)




0

TI-Basic, 17 bytes

Precisas para 10 decimais, podem ser ajustadas de 0 a 14 decimais com mais código.

Prompt P,N,M:1-binomcdf(M,P,N-1

0

Haskell, 54 bytes

(p%n)m|m<1=sum[1|n<1]|d<-m-1=(1-p)*(p%n)d+p*(p%(n-1))d

Define uma função (%). Chame assim (%) 0.4 2 3.


n <1 em vez de n <= 0.
Damien

0

Mathematica, 48 bytes

Sum[s^k(1-s)^(#3-k)#3~Binomial~k,{k,##2}]/.s->#&

Usa a fórmula de probabilidade de distribuição binomial para calcular a chance de k sucessos de k de n a m . Manipula os casos de borda usando uma soma simbólica em que s é uma variável simbólica para a probabilidade que é posteriormente substituída pelo valor real p . (Como s 0 = 1, mas 0 0 é indeterminado.)

Exemplo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.