Probabilità che qualcosa accada almeno n su m volte


11

Scrivi un programma o una funzione, che data una probabilità di successo p , un numero n e un numero di prove m restituisce la possibilità di almeno n successi su m prove.

La tua risposta deve essere precisa di almeno 5 cifre dopo il decimale.

Casi 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
Ti andrebbe di includere una formula per quelli di noi che non hanno studiato la distribuzione binomiale?
Leaky Nun,

2
@KennyLau Siamo spiacenti, fa parte della sfida.
orlp,

Risposte:


3

Gelatina , 15 14 byte

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

Letture m , n e p (in questo ordine) come argomenti della riga di comando. Provalo online!

Si noti che questo approccio richiede tempo di O (2 m ) e memoria, quindi non è abbastanza efficiente per i casi di test in cui m = 100 . Sulla mia macchina, il test case (m, n, p) = (20, 13, 0,5) richiede circa 100 secondi. Richiede troppa memoria per l'interprete online.

Come funziona

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 byte

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

modifica - 1 byte che passa alla distribuzione beta (sulla falsariga di @ Sp3000 Mathematica Answer)


3

Python, 57 byte

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 formula ricorsiva per i coefficienti binomiali, ad eccezione del caso base, m==0indica se il numero rimanente di successi richiesti nnon è negativo, con True/Falsefor1/0 . A causa del suo albero di ricorsione esponenziale, questo si blocca su input di grandi dimensioni.


Per provare questa risposta per casi di grandi dimensioni, aggiungere la memorizzazione nella cache utilizzando from functools import lru_cache; f = lru_cache(None)(f).
orlp,

@orlp Grazie, ho confermato i casi di test di grandi dimensioni.
xnor

3

Haskell, 73 byte

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 byte

Risparmiato 7 byte grazie 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 funzione arrayfun non è divertente, ma non ho trovato il modo di liberarmene ...



1

Pyth, 20 byte

JEKEcsmgsm<O0QKJCGCG

Provalo online!

Nota: CG è un numero molto grande che l'interprete non può gestire. Pertanto, il numero di prove è stato ridotto a ^ T3 che è mille. Pertanto, il collegamento produce un risultato impreciso.

Utilizza un approccio probabilistico puro.


Non credo che un approccio probabilistico sarebbe valido per questa domanda, ma dovremmo chiedere a @orlp
Sp3000,

È necessario nell'ordine di 1 / c ^ 2 prove per ottenere l'accuratezza c con alta probabilità, quindi sarebbe ~ 10 ^ 10 per cinque cifre decimali.
xnor

CG è un numero molto grande. In effetti, è la stringa "abc ... z" convertita da base-256 a decimale.
Leaky Nun,

2
Se "probabilstic" significa random, non è possibile garantire un valore preciso, indipendentemente da quante realizzazioni si media. In effetti, il risultato è diverso ogni volta.
Luis Mendo,

2
Esiste sempre una probabilità diversa da zero che il risultato non sia accurato con 5 cifre decimali. Pertanto non soddisfa i requisiti La tua risposta deve essere precisa per almeno 5 cifre
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)

Salvato 1 byte usando reduce! Spiegazione:

(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

Ottava, 26 byte

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

Questa è una funzione anonima. Per usarlo, assegnalo a una variabile.

Provalo qui .




0

TI-Basic, 17 byte

Preciso a 10 decimali, può essere regolato ovunque da 0-14 decimali con più codice.

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

0

Haskell, 54 byte

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

Definisce una funzione (%). Chiamalo come (%) 0.4 2 3.


n <1 invece di n <= 0.
Damien,

0

Mathematica, 48 byte

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

Utilizza la formula della probabilità di distribuzione binomiale per calcolare la probabilità di k successi per k da n a m . Gestisce i casi limite utilizzando una somma simbolica dove s è una variabile simbolica per la probabilità che viene successivamente sostituita con il valore effettivo p . (Poiché s 0 = 1 ma 0 0 è indeterminato.)

Esempio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.