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

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.


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)


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.


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

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



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.


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)

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 .




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

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.