Probabilité que quelque chose se produise au moins n fois sur m

11

Écrivez un programme ou une fonction, qui étant donné une probabilité de succès p , un nombre n et un nombre d'essais m renvoie la chance d' au moins n succès sur m essais.

Votre réponse doit être précise à au moins 5 chiffres après la décimale.

Cas de test:

 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
orlp
la source
3
Souhaitez-vous inclure une formule à ceux d'entre nous qui n'ont pas étudié la distribution binomiale?
Leaky Nun
2
@KennyLau Désolé, cela fait partie du défi.
orlp

Réponses:

3

Gelée , 15 14 octets

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

Lit m , n et p (dans cet ordre) comme arguments de ligne de commande. Essayez-le en ligne!

Notez que cette approche nécessite O (2 m ) de temps et de mémoire, elle n'est donc pas assez efficace pour les cas de test où m = 100 . Sur ma machine, le cas de test (m, n, p) = (20, 13, 0,5) prend environ 100 secondes. Cela nécessite trop de mémoire pour l'interprète en ligne.

Comment ça fonctionne

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.
Dennis
la source
9

Mathematica, 29 octets

BetaRegularized[#3,#,1+#2-#]&

Prend entrée dans l'ordre n,m,p. Mathematica est si bon qu'il joue même votre code pour vous:

entrez la description de l'image ici

BetaRegularizedest la fonction bêta incomplète régularisée .

Sp3000
la source
6

R, 32 31 octets

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

edit - passage d'un octet à la distribution bêta (dans le sens de @ Sp3000 Mathematica Answer)

mnel
la source
3

Python, 57 octets

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 formule récursive pour les coefficients binomiaux, à l'exception du cas de base, m==0indique si le nombre restant de succès requis nn'est pas négatif, avec True/Falsepour1/0 . En raison de son arbre de récursivité exponentielle, cela se bloque sur de grandes entrées.

xnor
la source
Pour tester cette réponse pour les cas volumineux, ajoutez la mise en cache à l'aide de from functools import lru_cache; f = lru_cache(None)(f).
orlp
@orlp Merci, j'ai confirmé les grands cas de test.
xnor
3

Haskell, 73 octets

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]]
Damien
la source
3

MATLAB, 78 71 octets

7 octets enregistrés grâce à 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 fonction arrayfun n'est pas amusante, mais je n'ai pas trouvé de moyen de m'en débarrasser ...

Stewie Griffin
la source
1

Pyth, 20 octets

JEKEcsmgsm<O0QKJCGCG

Essayez-le en ligne!

Remarque: CG est un très grand nombre que l'interpréteur ne peut pas gérer. Par conséquent, le nombre d'essais a été abaissé à ^ T3, soit mille. Par conséquent, le lien produit un résultat inexact.

Utilise une approche probabiliste pure.

Leaky Nun
la source
Je ne pense pas qu'une approche probabiliste serait valable pour cette question, mais nous aurions à demander @orlp
Sp3000
Vous avez besoin de l'ordre de 1 / c ^ 2 essais pour obtenir une précision c avec une probabilité élevée, ce qui serait ~ 10 ^ 10 pour cinq décimales.
xnor
CG est un très grand nombre. En fait, c'est la chaîne "abc ... z" convertie de base-256 en décimal.
Leaky Nun
2
Si «probabilstic» signifie aléatoire, vous ne pouvez pas garantir une valeur précise, quel que soit le nombre de réalisations que vous faites en moyenne. En fait, le résultat est différent à chaque fois.
Luis Mendo
2
Il y a toujours une probabilité non nulle que le résultat ne soit pas précis à 5 décimales près. Par conséquent, il ne remplit pas l'exigence Votre réponse doit être précise à au moins 5 chiffres
Luis Mendo
1

JavaScript (ES7), 82 octets

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

1 octet enregistré en utilisant reduce! Explication:

(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)
Neil
la source
1

Octave, 26 octets

@(p,n,m)1-binocdf(n-1,m,p)

Il s'agit d'une fonction anonyme. Pour l'utiliser, affectez-le à une variable.

Essayez-le ici .

Luis Mendo
la source
1

Gelée , 18 17 octets

⁵C*ạ×⁵*¥×c@
R’çSC

Lit n , m et p (dans cet ordre) comme arguments de ligne de commande. Essayez-le en ligne!

Dennis
la source
0

TI-Basic, 17 octets

Précis à 10 décimales, peut être ajusté de 0 à 14 décimales avec plus de code.

Prompt P,N,M:1-binomcdf(M,P,N-1
Timtech
la source
0

Haskell, 54 octets

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

Définit une fonction (%). Appelez ça comme (%) 0.4 2 3.

xnor
la source
n <1 au lieu de n <= 0.
Damien
0

Mathematica, 48 octets

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

Utilise la formule de la probabilité de distribution binomiale pour calculer la probabilité de k succès pour k de n à m . Gère les cas limites en utilisant une somme symbolique où s est une variable symbolique pour la probabilité qui est ensuite remplacée par la valeur réelle p . (Puisque s 0 = 1 mais 0 0 est indéterminé.)

Exemple

miles
la source