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

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.


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)


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.


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

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



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.


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)

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 .




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

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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.