随机权值选择算法
按权值随机选择算法
给你一个 下标从 0 开始 的正整数数组 w ,其中 w[i] 代表第 i 个下标的权重。
请你实现一个函数 pickIndex ,它可以 随机地 从范围 [0, w.length - 1] 内(含 0 和 w.length - 1)选出并返回一个下标。选取下标 i 的 概率 为 w[i] / sum(w) 。
例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。
1 | 输入: |
方案一:前缀和+二分查找
把待选择的数放平到线段上
如:
待选择的数组:[ 1,3,2,4,2 ]
按数字权值大小在线段上分布放平:
1___3__2____4__2
求出前缀和:
1___4__6____10__12
不难发现:现在前缀和数组可以表示,每一个数字占所有可能选择的几率(线段长度除以总长度)
那如果选择的是7呢?
这时,比如数组左边抛出一个小球,随机落到7点处,即6-10之间,其实已经是10的概率分布范围了。这时需要二分查找,查找当前数字的最左值,即10的位置。
1 | class Solution { |