最终越大,被选中的概率越大。转化成前缀和来做
在前缀和中进行二分查找
找到大于等于随机生成数【1–10】中的最小元素,例如随机数是4,5,6,7,的时候被选中的都是下标2。也就达成了根据权重选择的目标
public class Solution {
private final Random random = new Random();
private final int[] prefixSum;
private final int sum;
public Solution(int[] weights) {
prefixSum = new int[weights.length];
for (int i = 0, length = weights.length, sum = 0; i < length; i++) {
prefixSum[i] = sum + weights[i];
sum = prefixSum[i];
}
sum = prefixSum[weights.length - 1];
}
public int pickIndex() {
// random.nextInt(sum) 会等概率随机取 [0,sum-1] 中的任意一个数字
int target = random.nextInt(sum) + 1;
int left = 0, right = prefixSum.length - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (prefixSum[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return right;
}
}
作者:绿蚁
链接:https://leetcode.cn/problems/cuyjEf/solutions/1289958/hua-luo-yue-que-qian-zhui-he-ni-xiang-da-meph/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
取中点的通用代码r+(r-l)/2
向上取整的通用代码 pile+speed-1/speed 等价于pile/speed向上取整