我是靠谱客的博主 时尚康乃馨,最近开发中收集的这篇文章主要介绍Java根据权重生成随机数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

算法的思路为

  1. 将所有的key和value先放到一个集合
  2. 在添加在集合的过程中,权重是会累加的
  3. 生成介于0到100(总权重,不一定要为100)的随机数
  4. 通过累加的权重与这个随机数比较,如果比大于或等于它则输出

WeightedRandom.java

package util;

import java.util.*;

/**
 * @Author Daniel
 * @Description 根据权重生成随机数
 **/


public class WeightedRandom {

    public static void main(String[] args) {
        Map<String, Double> map = new HashMap<>();
        // 总和不一定非要等于100,是为了方便理解代码
        map.put("一等奖", 1.0);
        map.put("二等奖", 5.0);
        map.put("三等奖", 10.0);
        map.put("安慰奖", 30.0);
        map.put("谢谢参与", 54.0);
        // (输入值,生成多少个数)
        getResult(map, 100);
    }

    class Bean {
        String key;
        double sumWeight;
    }

    // 将所有的bean放在一个集合中
    List<Bean> beans = new ArrayList<>();
    // 总权重
    double sumWeight;

    // 将单个实体放入到实体集合中
    public void addBean(String key, double weight) {
        // 计算总权重
        sumWeight += weight;
        // 给bean赋值
        Bean b = new Bean();
        b.key = key;
        b.sumWeight = sumWeight;
        // 放入集合
        beans.add(b);

    }

    public String getRandom() {
        // 生成介于0.0到100.0的数
        double r = new Random().nextDouble() * sumWeight;
        // 遍历所有实体
        for (Bean bean : beans) {
            // 如果目前遍历的实体和大于这个随机数则将其输出
            /*
            举例:
            若权重和为100,生成的随机数为8.8,那么会得到三等奖
            因为map的值是这样的{三等奖=10.0, 谢谢参与=54.0, 一等奖=1.0, 安慰奖=30.0, 二等奖=5.0}
            而10.0(目前遍历的集合元素的权重和) > 8.8的,所以是三等奖
            即[0,10]三等奖,(10,64]谢谢参与,(64,65]一等奖,(65,95]安慰奖,(95,100]二等奖
            即我们需要的概率
             */
            if (bean.sumWeight >= r) {
                return bean.key;
            }
        }
        return null;
    }

    public static void getResult(Map<String, Double> map, int count) {
        // 每一个map对应一个WeightedRandom
        WeightedRandom itemDrops = new WeightedRandom();
        // 将map的值放入itemDrops对象中
        for (int i = 0; i < map.size(); i++) {
            for (Map.Entry<String, Double> m : map.entrySet()) {
                itemDrops.addBean(m.getKey(), m.getValue());
            }
        }
        for (int i = 0; i < count; i++) {
            System.out.println(itemDrops.getRandom());
        }
    }


}

最后

以上就是时尚康乃馨为你收集整理的Java根据权重生成随机数的全部内容,希望文章能够帮你解决Java根据权重生成随机数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部