Xác suất của một cái gì đó xảy ra ít nhất n trong số m lần


11

Viết chương trình hoặc hàm, xác suất thành công p , số n và số thử nghiệm m trả về cơ hội ít nhất n thành công trong số m thử nghiệm.

Câu trả lời của bạn phải chính xác đến ít nhất 5 chữ số sau số thập phân.

Các trường hợp thử nghiệm:

 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
Bạn có quan tâm đến việc bao gồm một công thức cho những người trong chúng ta chưa nghiên cứu phân phối nhị thức không?
Rò rỉ Nun

2
@KennyLau Xin lỗi, đó là một phần của thử thách.
orlp

Câu trả lời:


3

Thạch , 15 14 byte

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

Đọc m , np (theo thứ tự đó) dưới dạng đối số dòng lệnh. Hãy thử trực tuyến!

Lưu ý rằng phương pháp này đòi hỏi O (2 m ) thời gian và bộ nhớ, vì vậy nó không phải là khá đủ hiệu quả cho các trường hợp thử nghiệm nơi m = 100 . Trên máy của tôi, trường hợp thử nghiệm (m, n, p) = (20, 13, 0,5) mất khoảng 100 giây. Nó đòi hỏi quá nhiều bộ nhớ cho trình thông dịch trực tuyến.

Làm thế nào nó hoạt động

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)

chỉnh sửa - 1 byte chuyển sang phân phối beta (dọc theo dòng của Câu trả lời toán học @ Sp3000)


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

Công thức đệ quy cho các hệ số nhị thức, ngoại trừ trường hợp cơ sở m==0cho biết số lượng thành công cần thiết còn lại nlà không âm, với True/Falsefor1/0 . Bởi vì cây đệ quy theo cấp số nhân của nó, điều này ngăn chặn các đầu vào lớn.


Để kiểm tra câu trả lời này cho các trường hợp lớn, hãy thêm bộ đệm from functools import lru_cache; f = lru_cache(None)(f).
orlp

@orlp Cảm ơn, tôi đã xác nhận các trường hợp thử nghiệm lớn.
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

Đã lưu 7 byte nhờ 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

Hàm Arrayfun không có gì thú vị, nhưng tôi chưa tìm được cách nào để loại bỏ nó ...



1

Bình thường, 20 byte

JEKEcsmgsm<O0QKJCGCG

Hãy thử trực tuyến!

Lưu ý: CG là một số lượng rất lớn mà trình thông dịch không thể xử lý. Do đó, số lượng thử nghiệm đã được hạ xuống còn ^ T3 là một nghìn. Do đó, liên kết tạo ra một kết quả không chính xác.

Sử dụng phương pháp xác suất thuần túy.


Tôi không nghĩ rằng một cách tiếp cận xác suất sẽ có giá trị cho câu hỏi này, nhưng chúng ta phải hỏi @orlp
Sp3000

Bạn cần theo thứ tự 1 / c ^ 2 thử nghiệm để đạt được độ chính xác c với xác suất cao, do đó sẽ là ~ 10 ^ 10 cho năm chữ số thập phân.
xnor

CG là một con số rất lớn. Trên thực tế, đó là chuỗi "abc ... z" được chuyển đổi từ cơ sở-256 sang số thập phân.
Leaky Nun

2
Nếu "xác suất" có nghĩa là ngẫu nhiên, bạn không thể đảm bảo giá trị chính xác, bất kể bạn nhận được bao nhiêu nhận thức. Trong thực tế, kết quả là khác nhau mỗi lần.
Luis Mendo

2
Luôn luôn có một xác suất khác không rằng kết quả không chính xác đến 5 chữ số thập phân. Do đó, nó không đáp ứng yêu cầu Câu trả lời của bạn phải chính xác đến ít nhất 5 chữ số
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)

Đã lưu 1 byte bằng cách sử dụng reduce! Giải trình:

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




0

TI-Basic, 17 byte

Chính xác đến 10 số thập phân, có thể được điều chỉnh ở bất cứ đâu từ 0-14 số thập phân với nhiều mã hơn.

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

Xác định một hàm (%). Gọi nó như thế nào (%) 0.4 2 3.


n <1 thay vì n <= 0.
Damien

0

Toán học, 48 byte

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

Sử dụng công thức xác suất phân phối nhị thức để tính cơ hội k thành công cho k từ n đến m . Xử lý các trường hợp cạnh bằng cách sử dụng tổng ký hiệu trong đó s là biến tượng trưng cho xác suất được thay thế bằng giá trị thực p . (Vì s 0 = 1 nhưng 0 0 không xác định.)

Thí dụ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.