Xác suất là cơ hội获得 kết quả mong muốn từ tập dữ liệu có sẵn. Phạm vi xác suất nằm giữa 0 và 1, trong đó số nguyên 0 thể hiện khả năng không thể xảy ra và 1 chỉ sự chắc chắn.
Xác suất là gì?
Xác suất trong toán học cung cấp công cụ cho biết sự không chắc chắn của các sự kiện và lý do. Nói cách khác, xác suất xử lý việc tính toán khả năng xảy ra của một sự kiện cho trước, có thể biểu thị dưới dạng một số giữa 1 và 0. Ví dụ: xác suất xuất hiện mặt ngửa khi tung một đồng xu không thiên lệch, hoặc xuất hiện số 3 khi tung xúc xắc.
Quay lại câu hỏi, ta phải tìm xác suất có ít nhất k mặt ngửa trong N lần tung đồng xu.
Ví dụ: có 3 đồng xu và k = 2, vậy có 2^3 = 8 cách tung đồng xu là –
HHH, HTH, HHT, HTT, THH, THT, TTT, TTH.
Các trường hợp chứa ít nhất 2 mặt ngửa là –
HHH, HTH, HHT, THH.
Vậy xác suất sẽ là 4/8 hoặc 0.5.
Ví dụ
Đầu vào: k = 1, n = 3 Đầu ra: 0.875 Đầu vào: k = 3, n = 6 Đầu ra: 0.65625
Cách tiếp cận để giải bài toán trên –
- Nhận n và k làm đầu vào.
- Lưu giá trị giai thừa trong một mảng và gọi khi cần.
- Thực hiện tính toán.
- Trả về kết quả.
Thuật toán
Bước 1 -> Khai báo hàm tính xác suất có ít nhất k mặt ngửa trong n lần tung
double probability(int k, int n)
Khai báo và gán double check = 0
Vòng lặp Với i = k đến i <= n và ++i
Gán check += temp[n] / (temp[i] * temp[n - i])
Kết thúc
Gọi check = check / (1LL << n)
trả về check
Bước 2 -> Khai báo hàm tính toán trước giá trị
void precompute()
Gán temp[0] = temp[1] = 1
Vòng lặp Với i = 2 đến i < 20 và ++i
Gán temp[i] = temp[i - 1] * i
Bước 3 -> Trong main
Gọi precompute()
Gọi probability(1, 3)
Kết thúc
Ví dụ mã C++
#include <bits/stdc++.h>
using namespace std;
#define size 21
double temp[size];
// Tính xác suất có ít nhất k mặt ngửa trong n lần tung
double probability(int k, int n) {
double check = 0;
for (int i = k; i <= n; ++i)
check += temp[n] / (temp[i] * temp[n - i]);
check = check / (1LL << n);
return check;
}
void precompute() {
temp[0] = temp[1] = 1;
for (int i = 2; i < 20; ++i)
temp[i] = temp[i - 1] * i;
}
int main() {
precompute();
// Xác suất có 1 mặt ngửa từ 3 đồng xu
cout << "xác suất là : " << probability(1, 3) << "\n";
// Xác suất có 3 mặt ngửa từ 6 đồng xu
cout << "xác suất là : " << probability(3, 6) << "\n";
return 0;
}
Đầu ra
xác suất là : 0.875 xác suất là : 0.65625