Cho mảng trọng số w, hàm pickIndex() trả về chỉ số với xác suất tỷ lệ với trọng số.
Thuật toán (Prefix Sum + Binary Search)
- Xây dựng mảng tiền tố
prefix[i] = sum(w[0..i]). - Sinh ngẫu nhiên
rtrong[1, prefix.back()]. - Dùng
upper_boundtìm chỉ số đầu tiên ≥r.
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
vector prefix;
public:
Solution(vector& w) {
prefix = w;
for (int i=1; i v = {1,3};
Solution ob(v);
for (int i=0; i<5; i++) cout << ob.pickIndex() << " ";
return 0;
}
Đầu ra mẫu
1 1 1 1 0 (ngẫu nhiên)