Cho hàm rand7() sinh ngẫu nhiên đều 1..7. Viết rand10() sinh ngẫu nhiên đều 1..10 không dùng thư viện random.
Thuật toán (Rejection Sampling)
- Sinh số trong [0,48] bằng
(rand7()-1)*7 + (rand7()-1). - Nếu
< 40→ trả vềnum % 10 + 1. - Nếu ≥ 40 → lặp lại (loại bỏ bias).
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
int rand7() { return 1 + rand() % 7; }
class Solution {
public:
int rand10() {
int rand40 = 40;
while (rand40 >= 40) {
rand40 = (rand7()-1)*7 + (rand7()-1);
}
return rand40 % 10 + 1;
}
};
int main() {
srand(time(NULL));
Solution ob;
cout << ob.rand10() << endl;
cout << ob.rand10() << endl;
cout << ob.rand10() << endl;
return 0;
}
Đầu ra mẫu
2 2 6 (ngẫu nhiên)