面试算法71:按权重生成随机数

题目

输入一个正整数数组w,数组中的每个数字w[i]表示下标i的权重,请实现一个函数pickIndex根据权重比例随机选择一个下标。例如,如果权重数组w为[1,2,3,4],那么函数pickIndex将有10%的概率选择0、20%的概率选择1、30%的概率选择2、40%的概率选择3。

分析

可以创建另一个和权重数组的长度一样的数组sums,新数组的第i个数值sums[i]是权重数组中前i个数字之和。有了这个数组sums就能很方便地根据等概率随机生成的数字p按照权重比例选择下标。例如,累加权重数组[1,2,3,4]中的权重得到的数组sums为[1,3,6,10]。有了这个累加权重的数组之后,如果0到9之间的随机数p<1,那么选择0;如果1≤p<3,那么选择1;如果3≤p<6,那么选择2;如果6≤p<10,那么选择3。

public class Solution {
   
    private int[] sums;
    private int total;

    public Solution(int[] w) {
   
        sums = new int[w.length];
        for (int i = 0; i < w.length; i++) {
   
            total += w[i];
            sums[i] = total;
        }
    }

    public static void main(String[] args) {
   
        int[] w = {
   1,2,3,4};
        Solution solution = new Solution(w);
        System.out.println(solution.pickIndex());
    }

    public int pickIndex() {
   
        Random random = new Random();
        int p = random.nextInt(total);

        int left = 0;
        int right = sums.length;
        while (left <= right) {
   
            int mid = (left + right) / 2;
            if (sums[mid] > p) {
   
                if (mid == 0 || (sums[mid - 1] <= p)) {
   
                    return mid;
                }

                right = mid - 1;
            }
            else {
   
                left = mid + 1;
            }
        }

        return -1;
    }
}

相关推荐

  1. 面试算法71生成随机数

    2023-12-26 16:14:01       60 阅读
  2. Leetcode 528 随机选择

    2023-12-26 16:14:01       34 阅读
  3. 算法:带随机算法

    2023-12-26 16:14:01       49 阅读
  4. 面试算法-71-加一

    2023-12-26 16:14:01       45 阅读
  5. TF-IDF算法:揭秘文本数据的密码

    2023-12-26 16:14:01       25 阅读
  6. 面试算法72:求平方根

    2023-12-26 16:14:01       60 阅读
  7. 面试算法74:合并区间

    2023-12-26 16:14:01       49 阅读
  8. 面试算法79:所有子集

    2023-12-26 16:14:01       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-26 16:14:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-26 16:14:01       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-26 16:14:01       82 阅读
  4. Python语言-面向对象

    2023-12-26 16:14:01       91 阅读

热门阅读

  1. oracle11体系结构二-存储结构

    2023-12-26 16:14:01       53 阅读
  2. joiner

    2023-12-26 16:14:01       63 阅读
  3. 接口合集:含各种免费好用的api

    2023-12-26 16:14:01       56 阅读
  4. flutter 富文本思考

    2023-12-26 16:14:01       56 阅读
  5. jquery原生如何特定的条件里面阻止form表单提交

    2023-12-26 16:14:01       43 阅读
  6. 栈与队列part03

    2023-12-26 16:14:01       67 阅读