按权重随机选择

528. 按权重随机选择

 

见识过很多等概率随机选择,本片文章介绍一种「按权重随机选择」

对于样例:w = [1, 2, 3, 4]

这里使用「前缀和」「二分搜索」。是不是觉得很莫名其妙,这和前缀和、二分搜索有什么关系,不要急,一步一步的来分析!!

关于「前缀和」的详细介绍可见 前缀和数组

关于「二分搜索」的详细介绍可见 二分搜索

关于Random的详细介绍可见 Random 类

 

我们需要考虑的无非就是如何才能按权重的选择,Random()返回的都是等概率的

对于样例:w = [1, 2, 3, 4],其「前缀和数组」可视化如下:

2

随机生成一个区间为[1, 10]的数:

刚好上述权重和最初分析的概率是等价的!!

对于target = 5,返回一个大于等于 5 的最小下标,即为 2

注意:preSum[]相对于原数组整体向右偏移了一位

下面给出完整代码: