Đây thực sự là một vấn đề thú vị. Tôi đã được truyền cảm hứng để viết một bài đăng blog về nó bao gồm chi tiết công bằng và không công bằng đồng xu ném tất cả các cách để tình hình của OP có một xác suất khác nhau cho mỗi đồng xu. Bạn cần một kỹ thuật được gọi là lập trình động để giải quyết vấn đề này trong thời gian đa thức.
Vấn đề chung: Với C, một loạt các n tiền xu p-pn nơi pi đại diện cho xác suất của số i -th co trong đầu sắp tới, xác suất của k người đứng đầu từ việc tung tất cả tiền xu là gì?
Điều này có nghĩa việc giải quyết các mối quan hệ tái phát sau:
P (n, k, C, i) = pi x P (n -1, k -1, C, i +1) + (1- pi) x P (n, k, C, i +1)
Đoạn mã Java thực hiện điều này là:
private static void runDynamic() {
long start = System.nanoTime();
double[] probs = dynamic(0.2, 0.3, 0.4);
long end = System.nanoTime();
int total = 0;
for (int i = 0; i < probs.length; i++) {
System.out.printf("%d : %,.4f%n", i, probs[i]);
}
System.out.printf("%nDynamic ran for %d coinsin %,.3f ms%n%n",
coins.length, (end - start)/1000000d);
}
private static double[] dynamic(double... coins) {
double[][] table = new double[coins.length + 2][];
for (int i = 0; i < table.length; i++) {
table[i] = new double[coins.length + 1];
}
table[1][coins.length] = 1.0d; // everything else is 0.0
for (int i = 0; i <= coins.length; i++) {
for (int j = coins.length - 1; j >= 0; j--) {
table[i + 1][j] = coins[j] * table[i][j + 1] +
(1 - coins[j]) * table[i + 1][j + 1];
}
}
double[] ret = new double[coins.length + 1];
for (int i = 0; i < ret.length; i++) {
ret[i] = table[i + 1][0];
}
return ret;
}
Điều này đang làm là xây dựng một bảng hiển thị xác suất mà một chuỗi các đồng xu từ p i-p n chứa k đầu.
Để biết giới thiệu sâu hơn về xác suất nhị thức và thảo luận về cách áp dụng lập trình động, hãy xem Coin Tosses, Binomials and Dynamic Programming.
Bạn đang tìm kiếm một biểu hiện hình thức đóng? – dirkgently
Vui lòng xem bài đăng cập nhật. – cletus