Trong bài toán này, chúng ta phải tạo một hàm sẽ sinh ba số dựa trên xác suất cho trước.
Để làm điều này, chúng ta sẽ dùng hàm sinh số ngẫu nhiên tích hợp sẵn là rand(a, b) sinh số ngẫu nhiên trong phạm vi [a, b] với xác suất bằng nhau.
Nhiệm vụ của chúng ta là trả về chỉ ba số A, B, C có xác suất xuất hiện lần lượt là P(A), P(B), P(C) và theo định nghĩa xác suất P(A) + P(B) + P(C) = 1.
Để tạo hàm của chúng ta dùng rand(a,b). Chúng ta sẽ dùng tính năng của nó là xác suất xuất hiện của bất kỳ số nào từ a đến b là như nhau. Nhưng chúng ta phải có A với xác suất P(A) v.v. Vì vậy, chúng ta sẽ dùng xác suất phần trăm của các số, tức là nếu P(A) = 1/5, chúng ta sẽ xem nó như 20%.
Vì vậy, xác suất phần trăm tối đa sẽ là 100%, nên chúng ta sẽ sinh số ngẫu nhiên từ 0 đến 100 và dựa trên số sinh ra, chúng ta sẽ trả về số trong A, B, C dựa trên các điều kiện sau.
Trường hợp 1 - Nếu số sinh ra nằm giữa 0 và P(A), trả về A.
Trường hợp 2 - Nếu số sinh ra nằm giữa P(A) và P(A)+P(B), trả về B.
Trường hợp 3 - Nếu số sinh ra nằm giữa P(A)+P(B) và 1{P(A)+P(B)+P(C)}, trả về C.
Hãy xem ví dụ làm rõ khái niệm,
Đầu vào
A = 3 , P(A) = 35% B = 43, P(B) = 50% C = 90, P(C) = 15%
Chương trình sẽ trả về,
3 nếu hàm rand sinh số giữa 0 và 35.
43 nếu hàm rand sinh số giữa 35 và 85.
90 nếu hàm rand sinh số giữa 85 và 100.
Chương trình triển khai logic của chúng ta,
Ví dụ
#include<iostream> using namespace std; int randomABC(int A, int B, int C, int PA, int PB, int PC){ int randNumber = rand()%100+1; if (randNumber <= PA) return A; if (randNumber <= (PA+PB)) return B; else return C; } int main(){ cout<<"Số ngẫu nhiên giữa 3, 45, 90 với xác suất cho trước là : "<<randomABC(3, 43, 90, 35, 40, 25); return 0; }Đầu ra
Số ngẫu nhiên giữa 3, 45, 90 với xác suất cho trước là : 3