C++ 不常用的奇淫巧计
leetcode-剑指offerII 071.按权重生成随机数
给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w[i] 成正比。
例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。
也就是说,选取下标 i 的概率为 w[i] / sum(w) 。
/*
mt19937:一种随机数生成算法
uniform_int_distribution:均匀分布
accumulate():累加求和
partial_sum:求前缀和
back_inserter():插入到容器后面
lower_bound():查找下界
*/class Solution{
private:mt19937 gen;uniform_int_distribution<int> dis;vector<int> pre;
public:Solution(vector<int>& w):gen(random_device{}()), dis(1, accumulate(w.begin(), w.end(), 0)){partial_sum(w.begin(), w.end(), back_inserter(pre));}int pickIndex(){int x = dis(gen);return lower_bound(pre.begin(), pre.end(), x) - pre.begin();}
}
计算最大公约数
int gcd = __gcd(x, y);
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
