Kemungkinan sesuatu terjadi setidaknya n kali

11

Tulis sebuah program atau fungsi, yang diberi probabilitas keberhasilan p , angka n dan sejumlah percobaan m mengembalikan peluang setidaknya n keberhasilan keluar dari percobaan m .

Jawaban Anda harus tepat setidaknya 5 digit setelah desimal.

Kasus uji:

 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
sumber
3
Maukah Anda memasukkan formula kepada kami yang belum mempelajari distribusi binomial?
Leaky Nun
2
@ KennyLau Maaf, itu bagian dari tantangan.
orlp

Jawaban:

3

Jelly , 15 14 byte

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

Membaca m , n dan p (dalam urutan itu) sebagai argumen baris perintah. Cobalah online!

Perhatikan bahwa pendekatan ini membutuhkan waktu dan memori O (2 m ) , sehingga tidak cukup efisien untuk kasus uji di mana m = 100 . Di komputer saya, kotak uji (m, n, p) = (20, 13, 0,5) kira-kira membutuhkan 100 detik. Ini membutuhkan terlalu banyak memori untuk penerjemah online.

Bagaimana itu bekerja

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

Mathematica, 29 byte

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

Mengambil input dalam urutan n,m,p. Mathematica sangat bagus, bahkan golf kode Anda untuk Anda:

masukkan deskripsi gambar di sini

BetaRegularizedadalah fungsi beta tidak lengkap yang diatur .

Sp3000
sumber
6

R, 32 31 byte

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

sunting - 1 byte beralih ke distribusi beta (sepanjang baris @ Sp3000 Mathematica Answer)

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

Rumus rekursif untuk koefisien binomial, kecuali kasus dasar m==0menunjukkan apakah jumlah sisa keberhasilan yang diperlukan nadalah negatif, dengan True/Falseuntuk1/0 . Karena pohon rekursi eksponensial, ini berhenti pada input besar.

Tidak
sumber
Untuk menguji jawaban ini untuk kasus besar, tambahkan caching menggunakan from functools import lru_cache; f = lru_cache(None)(f).
orlp
@ Atau Terima kasih, saya mengkonfirmasi kasus uji besar.
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]]
Damien
sumber
3

MATLAB, 78 71 byte

Disimpan 7 byte berkat 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

Fungsi arrayfun tidak menyenangkan, tapi saya belum menemukan cara untuk menghilangkannya ...

Stewie Griffin
sumber
1

Pyth, 26 byte

AQJEsm**.cHd^Jd^-1J-HdrGhH

Cobalah online!

Menggunakan distribusi binomial kumulatif standar.

Biarawati Bocor
sumber
1

Pyth, 20 byte

JEKEcsmgsm<O0QKJCGCG

Cobalah online!

Catatan: CG adalah angka yang sangat besar yang tidak bisa ditangani oleh penerjemah. Oleh karena itu, jumlah percobaan telah diturunkan menjadi ^ T3 yaitu seribu. Karenanya, tautan menghasilkan hasil yang tidak akurat.

Menggunakan pendekatan probabilistik murni.

Biarawati Bocor
sumber
Saya tidak berpikir pendekatan probabilistik akan valid untuk pertanyaan ini, tetapi kita harus bertanya pada @orlp
Sp3000
Anda membutuhkan urutan 1 / c ^ 2 percobaan untuk mendapatkan akurasi c dengan probabilitas tinggi, sehingga akan menjadi ~ 10 ^ 10 untuk lima tempat desimal.
xnor 16
Jumlah CG sangat besar. Bahkan, itu adalah string "abc ... z" yang dikonversi dari basis-256 ke desimal.
Leaky Nun
2
Jika "probabilstic" berarti acak, Anda tidak dapat menjamin nilai yang akurat, tidak peduli berapa banyak realisasi yang Anda rata-rata. Bahkan, hasilnya berbeda setiap saat.
Luis Mendo
2
Selalu ada probabilitas nol bahwa hasilnya tidak akurat hingga 5 desimal. Karena itu tidak memenuhi persyaratan . Jawaban Anda harus tepat untuk setidaknya 5 digit
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)

Disimpan 1 byte dengan menggunakan reduce! Penjelasan:

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

Oktaf, 26 byte

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

Ini adalah fungsi anonim. Untuk menggunakannya, tetapkan ke variabel.

Coba di sini .

Luis Mendo
sumber
1

Jelly , 18 17 byte

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

Membaca n , m dan p (dalam urutan itu) sebagai argumen baris perintah. Cobalah online!

Dennis
sumber
0

TI-Basic, 17 byte

Tepat hingga 10 desimal, dapat disesuaikan di mana saja dari 0-14 desimal dengan lebih banyak kode.

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

Menentukan fungsi (%). Sebut saja seperti (%) 0.4 2 3.

Tidak
sumber
n <1 bukannya n <= 0.
Damien
0

Mathematica, 48 byte

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

Menggunakan binomial rumus probabilitas distribusi untuk menghitung peluang k keberhasilan untuk k dari n ke m . Menangani kasus tepi dengan menggunakan jumlah simbolik di mana s adalah variabel simbolik untuk probabilitas yang kemudian diganti dengan nilai aktual p . (Karena s 0 = 1 tetapi 0 0 tidak dapat ditentukan.)

Contoh

mil
sumber