(Bởi vì cách tiếp cận này độc lập với các giải pháp khác được đăng, bao gồm một giải pháp mà tôi đã đăng, tôi sẽ cung cấp nó như một phản hồi riêng biệt).
Bạn có thể tính toán phân phối chính xác trong vài giây (hoặc ít hơn) với điều kiện tổng của p là nhỏ.
Chúng tôi đã thấy các đề xuất rằng phân phối có thể xấp xỉ là Gaussian (trong một số kịch bản) hoặc Poisson (trong các kịch bản khác). Dù bằng cách nào, chúng ta biết ý nghĩa của nó là tổng của và phương sai của nó là tổng của . Do đó, phân phối sẽ được tập trung trong một vài độ lệch chuẩn của giá trị trung bình của nó, giả sử SD với trong khoảng từ 4 đến 6 hoặc khoảng đó. Do đó, chúng ta chỉ cần tính xác suất để tổng bằng (một số nguyên) với thông qua . Khi hầu hết cácμpiσ2pi(1−pi)zzXkk=μ−zσk=μ+zσpilà nhỏ, xấp xỉ bằng (nhưng hơi nhỏ hơn) , vì vậy để bảo thủ, chúng ta có thể tính toán cho trong khoảng . Ví dụ: khi tổng bằng và chọn để che đuôi tốt, chúng ta sẽ cần tính toán để bao phủ trong = , chỉ có 28 giá trị.σ2μk[μ−zμ−−√,μ+zμ−−√]pi9z=6k[9−69–√,9+69–√][0,27]
Phân phối được tính toán đệ quy . Đặt là phân phối tổng của đầu tiên của các biến Bernoulli này. Với mọi từ đến , tổng của các biến đầu tiên có thể bằng theo hai cách loại trừ lẫn nhau: tổng của các biến đầu tiên bằng và là hoặc nếu không, tổng của các biến đầu tiên bằng và là . vì thếfiij0i+1i+1jiji+1st0ij−1i+1st1
fi+1(j)=fi(j)(1−pi+1)+fi(j−1)pi+1.
Chúng ta chỉ cần thực hiện tính toán này cho tích phân trong khoảng từ đếnj max(0,μ−zμ−−√) μ+zμ−−√.
Khi hầu hết các đều nhỏ (nhưng vẫn có thể phân biệt được với với độ chính xác hợp lý), cách tiếp cận này không bị ảnh hưởng bởi sự tích lũy rất lớn của các lỗi làm tròn điểm nổi được sử dụng trong giải pháp tôi đã đăng trước đây. Do đó, tính toán độ chính xác mở rộng là không cần thiết. Ví dụ: phép tính chính xác kép cho một mảng có xác suất ( , yêu cầu tính toán cho xác suất của các khoản tiền trong khoảng từ đếnpi1−pi1216pi=1/(i+1)μ=10.6676031) mất 0,1 giây với Mathicala 8 và 1-2 giây với Excel 2002 (cả hai đều có cùng câu trả lời). Lặp lại nó với độ chính xác gấp bốn lần (trong Mathicala) mất khoảng 2 giây nhưng không thay đổi bất kỳ câu trả lời nào quá . Chấm dứt phân phối tại SD vào đuôi trên chỉ mất trong tổng xác suất.3×10−15z=63.6×10−8
Một tính toán khác cho một mảng gồm 40.000 giá trị ngẫu nhiên chính xác gấp đôi trong khoảng từ 0 đến 0,001 ( ) mất 0,08 giây với .μ=19.9093
Thuật toán này là song song. Chỉ cần chia tập hợp thành các tập hợp khác nhau có kích thước xấp xỉ bằng nhau, mỗi bộ cho mỗi bộ xử lý. Tính toán phân phối cho mỗi tập hợp con, sau đó xác nhận kết quả (sử dụng FFT nếu bạn muốn, mặc dù việc tăng tốc này có thể là không cần thiết) để có được câu trả lời đầy đủ. Điều này làm cho nó thực tế để sử dụng ngay cả khi trở nên lớn, khi bạn cần nhìn xa ra đuôi ( lớn) và / hoặc lớn.piμzn
Thời gian cho một mảng gồm biến với bộ xử lý tỷ lệ là . Tốc độ của Mathematica là một triệu mỗi giây. Ví dụ: với bộ xử lý , biến thiên, tổng xác suất và đi ra độ lệch chuẩn vào đuôi trên, triệu: tính một vài giây thời gian tính toán. Nếu bạn biên dịch cái này, bạn có thể tăng tốc hiệu suất hai bậc độ lớn.nmO(n(μ+zμ−−√)/m)m=1n=20000μ=100z=6n(μ+zμ−−√)/m=3.2
Ngẫu nhiên, trong các trường hợp thử nghiệm này, các biểu đồ phân phối rõ ràng cho thấy một số sai lệch tích cực: chúng không bình thường.
Đối với bản ghi, đây là một giải pháp Mathicala:
pb[p_, z_] := Module[
{\[Mu] = Total[p]},
Fold[#1 - #2 Differences[Prepend[#1, 0]] &,
Prepend[ConstantArray[0, Ceiling[\[Mu] + Sqrt[\[Mu]] z]], 1], p]
]
( NB Mã màu được áp dụng bởi trang web này là vô nghĩa đối với mã Mathicala. Đặc biệt, nội dung màu xám không phải là nhận xét: đó là nơi tất cả công việc được thực hiện!)
Một ví dụ về việc sử dụng nó là
pb[RandomReal[{0, 0.001}, 40000], 8]
Chỉnh sửa
Một R
giải pháp chậm hơn mười lần so với Mathicala trong trường hợp thử nghiệm này - có lẽ tôi chưa mã hóa nó một cách tối ưu - nhưng nó vẫn thực thi nhanh chóng (khoảng một giây):
pb <- function(p, z) {
mu <- sum(p)
x <- c(1, rep(0, ceiling(mu + sqrt(mu) * z)))
f <- function(v) {x <<- x - v * diff(c(0, x));}
sapply(p, f); x
}
y <- pb(runif(40000, 0, 0.001), 8)
plot(y)