Probabilidad de que algo ocurra al menos n de m veces


11

Escriba un programa o función, que dada una probabilidad de éxito p , un número ny una cantidad de intentos m devuelve la posibilidad de al menos n éxitos de m intentos.

Su respuesta debe ser precisa al menos 5 dígitos después del decimal.

Casos de prueba:

 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
¿Te gustaría incluir una fórmula para aquellos de nosotros que no hemos estudiado la distribución binomial?
Leaky Nun

2
@KennyLau Lo siento, eso es parte del desafío.
orlp

Respuestas:


3

Jalea , 15 14 bytes

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

Lee m , n y p (en ese orden) como argumentos de línea de comandos. Pruébalo en línea!

Tenga en cuenta que este enfoque requiere O (2 m ) de tiempo y memoria, por lo que no es lo suficientemente eficiente para los casos de prueba donde m = 100 . En mi máquina, el caso de prueba (m, n, p) = (20, 13, 0.5) toma aproximadamente 100 segundos. Requiere demasiada memoria para el intérprete en línea.

Cómo 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)

edit - 1 byte cambiando a distribución beta (en la línea de @ Sp3000 Mathematica Answer)


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

La fórmula recursiva para los coeficientes binomiales, excepto el caso base m==0indica si el número restante de éxitos requeridos nno es negativo, con True/Falsefor1/0 . Debido a su árbol de recursión exponencial, esto se detiene en entradas grandes.


Para probar esta respuesta para casos grandes, agregue el almacenamiento en caché usando from functools import lru_cache; f = lru_cache(None)(f).
orlp

@orlp Gracias, he confirmado los grandes casos de prueba.
xnor

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 gracias 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

La función arrayfun no es divertida, pero no he encontrado una manera de deshacerme de ella ...



1

Pyth, 20 bytes

JEKEcsmgsm<O0QKJCGCG

Pruébalo en línea!

Nota: CG es un número muy grande que el intérprete no puede manejar. Por lo tanto, el número de pruebas se ha reducido a ^ T3, que es mil. Por lo tanto, el enlace produce un resultado inexacto.

Utiliza un enfoque probabilístico puro.


No creo que un enfoque probabilístico sea válido para esta pregunta, pero tendríamos que preguntarle a @orlp
Sp3000

Necesita en el orden de 1 / c ^ 2 ensayos para obtener una precisión c con alta probabilidad, por lo que sería ~ 10 ^ 10 para cinco decimales.
xnor

CG es un número muy grande. De hecho, es la cadena "abc ... z" convertida de base-256 a decimal.
Leaky Nun

2
Si "probabilístico" significa aleatorio, no puede garantizar un valor exacto, sin importar cuántas realizaciones promedie. De hecho, el resultado es diferente cada vez.
Luis Mendo

2
Siempre hay una probabilidad distinta de cero de que el resultado no sea exacto a 5 decimales. Por lo tanto, no cumple el requisito. Su respuesta debe ser precisa de al 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)

¡Guardado 1 byte usando reduce! Explicación:

(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

Preciso a 10 decimales, se puede ajustar en cualquier lugar de 0-14 decimales con más 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 una función (%). Llámalo como (%) 0.4 2 3.


n <1 en lugar de n <= 0.
Damien

0

Mathematica, 48 bytes

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

Utiliza la fórmula probabilidad de distribución binomial para calcular la probabilidad de k éxitos para k de n a m . Maneja los casos límite utilizando una suma simbólica donde s es una variable simbólica para la probabilidad que luego se reemplaza con el valor real p . (Dado que s 0 = 1 pero 0 0 es indeterminado).

Ejemplo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.