Wahrscheinlichkeit, dass etwas mindestens n von m Mal passiert

11

Schreiben Sie ein Programm oder eine Funktion, die bei einer Erfolgswahrscheinlichkeit p , einer Zahl n und einer Anzahl von Versuchen m die Chance von mindestens n Erfolgen aus m Versuchen zurückgibt .

Ihre Antwort muss auf mindestens 5 Nachkommastellen genau sein.

Testfälle:

 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
quelle
3
Möchten Sie denjenigen von uns, die die Binomialverteilung nicht untersucht haben, eine Formel hinzufügen?
Undichte Nonne
2
@KennyLau Sorry, das ist Teil der Herausforderung.
Orlp

Antworten:

3

Gelee , 15 14 Bytes

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

Liest m , n und p (in dieser Reihenfolge) als Befehlszeilenargumente. Probieren Sie es online aus!

Beachten Sie, dass dieser Ansatz erfordert O (2 m ) Zeit und Speicher, so dass es nicht ist ziemlich effizient genug für den Test Fälle , in denen m = 100 . Auf meiner Maschine dauert der Testfall (m, n, p) = (20, 13, 0,5) ungefähr 100 Sekunden. Der Online-Interpreter benötigt zu viel Speicher.

Wie es funktioniert

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
quelle
9

Mathematica, 29 Bytes

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

Nimmt Eingaben in der Reihenfolge vor n,m,p. Mathematica ist so gut, dass es sogar Ihren Code für Sie spielt:

Geben Sie hier die Bildbeschreibung ein

BetaRegularizedist die regulierte unvollständige Beta-Funktion .

Sp3000
quelle
6

R, 32 31 Bytes

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

edit - 1 Byte Umschaltung auf Beta-Distribution (nach dem Vorbild von @ Sp3000 Mathematica Answer)

mnel
quelle
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

Die rekursive Formel für Binomialkoeffizienten mit Ausnahme des Basisfalls m==0gibt an, ob die verbleibende Anzahl der erforderlichen Erfolge nicht nnegativ ist, mit True/Falsez1/0 . Aufgrund seines exponentiellen Rekursionsbaums bleibt dies bei großen Eingaben stehen.

xnor
quelle
Fügen Sie das Caching mit hinzu, um diese Antwort für große Fälle zu testen from functools import lru_cache; f = lru_cache(None)(f).
Orlp
@orlp Danke, ich habe die großen Testfälle bestätigt.
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]]
Damien
quelle
3

MATLAB, 78 71 Bytes

7 Bytes dank Luis Mendo gespart!

@(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

Die Arrayfun-Funktion macht keinen Spaß, aber ich habe keinen Weg gefunden, sie loszuwerden ...

Stewie Griffin
quelle
1

Pyth, 20 Bytes

JEKEcsmgsm<O0QKJCGCG

Probieren Sie es online aus!

Hinweis: CG ist eine sehr große Zahl, die der Interpreter nicht verarbeiten kann. Daher wurde die Anzahl der Versuche auf ^ T3 gesenkt, was eintausend ist. Daher führt die Verknüpfung zu einem ungenauen Ergebnis.

Verwendet einen rein probabilistischen Ansatz.

Undichte Nonne
quelle
Ich denke nicht, dass ein probabilistischer Ansatz für diese Frage gültig wäre, aber wir müssten @orlp
Sp3000
Sie müssen in der Größenordnung von 1 / c ^ 2 Versuchen mit hoher Wahrscheinlichkeit in die Genauigkeit c gelangen, sodass dies für fünf Dezimalstellen ~ 10 ^ 10 wäre.
xnor
CG ist eine sehr große Zahl. Tatsächlich ist es die Zeichenfolge "abc ... z", die von base-256 in decimal konvertiert wurde.
Undichte Nonne
2
Wenn "probabilstic" zufällig bedeutet, können Sie keinen genauen Wert garantieren , unabhängig davon, wie viele Realisierungen Sie durchschnittlich durchführen. Tatsächlich ist das Ergebnis jedes Mal anders.
Luis Mendo
2
Es besteht immer eine Wahrscheinlichkeit ungleich Null, dass das Ergebnis nicht auf 5 Dezimalstellen genau ist. Daher erfüllt es nicht die Anforderung Ihre Antwort muss auf mindestens 5 Stellen präzise sein
Luis Mendo
1

JavaScript (ES7), 82 Byte

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

1 Byte mit reduce! Gespeichert ! Erläuterung:

(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
quelle
1

Oktave, 26 Bytes

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

Dies ist eine anonyme Funktion. Um es zu verwenden, weisen Sie es einer Variablen zu.

Probieren Sie es hier aus .

Luis Mendo
quelle
0

TI-Basic, 17 Bytes

Präzise bis 10 Dezimalstellen, können mit mehr Code zwischen 0 und 14 Dezimalstellen eingestellt werden.

Prompt P,N,M:1-binomcdf(M,P,N-1
Timtech
quelle
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

Definiert eine Funktion (%). Nennen wir es wie (%) 0.4 2 3.

xnor
quelle
n <1 statt n <= 0.
Damien
0

Mathematica, 48 Bytes

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

Verwendet die Binomialverteilungswahrscheinlichkeitsformel, um die Wahrscheinlichkeit von k Erfolgen für k von n bis m zu berechnen . Behandelt die Randfälle unter Verwendung einer symbolischen Summe, wobei s eine symbolische Variable für die Wahrscheinlichkeit ist, die später durch den tatsächlichen Wert p ersetzt wird . (Da s 0 = 1 ist, aber 0 0 unbestimmt ist.)

Beispiel

Meilen
quelle