首页 > 其他分享 >根据数据的权重,随机返回一个数据

根据数据的权重,随机返回一个数据

时间:2023-07-05 17:45:38浏览次数:25  
标签:weight 权重 int data range 随机 dataWeightMap put 数据

/**
 * 根据权重,随机取出值
 * @param dataWeightMap 数据-权重 的映射
 * @param <T> 数据类型
 * @return 根据权重随机的数据
 */
public static <T> T randomWeight(Map<T, Integer> dataWeightMap){
   // <数据, int[min, max]> 计算是否属于此范围时:前包后不包
   Map<T, int[]> rangeMapper = new HashMap<>();

   int count=0;
   for(T data : dataWeightMap.keySet()){
      // 初始化权重
      Integer weight = dataWeightMap.get(data);
      weight = weight == null ? 1 : weight;
      if(weight < 1) {
         continue;
      }
      // 初始化范围
      int[] range = new int[2];
      rangeMapper.put(data, range);
      
      // 计算随机范围
      range[0] = count;
      count += weight;
      range[1] = count;
   }
   // 生成随机数,并判断符合权重范围(前包后不包)的数据
   int randNum = (int) (Math.random() * count);
   for(T data : rangeMapper.keySet()){
      int[] range = rangeMapper.get(data);
      if(randNum >= range[0] && randNum < range[1]) {
         return data;
      }
   }
   return null;
}

测试:

/**
* 权重随机返回测试
* @param args
*/
public static void main(String[] args) {
Map<String, Integer> dataWeightMap = new HashMap<>();
dataWeightMap.put("A", 2);
dataWeightMap.put("B", 1);
dataWeightMap.put("C", 2);
dataWeightMap.put("D", 1);

Map<String, Integer> countMap = new HashMap<>();
dataWeightMap.forEach((k, v) -> countMap.put(k, 0));

int num = 1000000;
for(int i=0; i< num; i ++) {
String res = randomWeight(dataWeightMap);
countMap.compute(res, (k, v) -> v + 1);
}

countMap.forEach((k, v) -> System.out.println(k+":"+v));
}
 

结果:

A:332530
B:166882
C:333462
D:167126

====================

A:332845
B:167135
C:333458
D:166562

可自行修改参数,反复测试

 

标签:weight,权重,int,data,range,随机,dataWeightMap,put,数据
From: https://www.cnblogs.com/ryuusho/p/17529385.html

相关文章

  • 数据链路层实验
    目录实验一实验二实验三结束实验一在eNSP软件中,设置一台交换机和四台主机,我们把PC3的ip地址设为192.168.1.1,子网掩码设为255.255.255.0,把PC4的ip地址设为192.168.1.2,子网掩码设为255.255.255.0。第一步PC3向交换机发送数据帧,然后第二步交换机向其他各个PC寻求回应,第三步PC4回应......
  • django中使用form表单或者ajax提交数据时如何验证csrftoken
    使用form表单来提交数据时,如何验证csrftokenajax提交数据时验证csrftoken在需要提交的html页面引入以下js文件就行引入csrf.js文件<scriptsrc="{%static'js/csrf.js'%}"></script>文件内容:/***根据cookie的name获取对应的值*@paramname*@returns{null}......
  • Linux随机生成数
    简介在某些情况下,我们需要随机产生一个数来在一些场景中使用,例如验证码、ssh反向代理随机数的产生,又或者在一些shell脚本设计中需要用到随机数,这里介绍常用几个linux产生随机数的方法。使用shufshuf命令在一些Linux系统中是自带的,但并不是所有系统都包含该命令。在Ubuntu......
  • Postgresql 大象数据库long自定义自增
     Postgresql --创建序列CREATESEQUENCEuser_long_id_seqSTART100000;CREATESEQUENCEdepartments_long_id_seqSTART100000;CREATESEQUENCEpositions_long_id_seqSTART100000;CREATESEQUENCEposition_grades_long_id_seqSTART100000;--设置对应列Key值A......
  • 代理IP,如何助力大数据时代
    代理IP,如何为大数据助力华科云商助力大数据近年来,我国互联网商业保持持续发展的状态。大环境的优化,各项相关政策的出台,也为互联网经济的发展,提供了强有力的支持。大大小小的企业都想乘风起势,大展宏图,积极推动各项数据业务的进程,提前占领市场先机。对于企业而言,想要推动业务快速地发......
  • MongoDB数据库部署与应用
    MongoDB数据库部署与应用拓扑图:推荐步骤:在Centos01上安装mongoDB数据库管理mongoDB服务生成MongoDB配置文件通过控制文件控制MongoDB服务,配置MongoDB身份验证配置mongoDB身份验证管理和修改配置文件支持验证配置mongoDB基本管理配置MongoDB数据备份恢复实验步骤:一.在Centos01上安装m......
  • DMA数据发送模块实现
    DMA数据发送模块实现发送模块的数据接口发送模块使用AXIStream接口与DMA控制器通信,AXIStream是一种简单的点对点数据流协议,主要包含以下三个信号:valid:表示发送方是否有有效的数据。ready:表示接收方是否准备好接收数据。data:表示数据本身,可以是任意位宽。另外,AXIStrea......
  • 无法删除数据库,因为该数据库当前正在使用
    原文:https://blog.csdn.net/weixin_30411997/article/details/94776946除数据库时提示数据库正在被使用,无法删除(Cannotdropdatabasedatabasenamebecauseitiscurrentlyinuse)的问题 删除数据库时提示数据库正在被使用,无法删除(Cannotdropdatabasedatabasenamebe......
  • VUE 2项目使用vue-json-excel导出数据
    记录一下后端返回的json数据转成excel导出这里外面使用的是vue-json-excel1.安装包npminstallvue-json-excel2.组件中使用<download-excelclass="btnbtn-default":data="json_data":fields="json_fields"worksheet="MyWorksheet"name=&......
  • 解决升级Jeesite版本(gradle构建),可能导致初始化数据库数据失败的问题?
    1、核心模块core下的资源文件,因存放在java文件路径下,不规范可能导致找不到初始化数据表。报错截图:  解决办法:在core文件夹下的资源文件复制一份初始化数据表。 2.cms文件使用gradle构建时,需要build文件里的jar包,如果缺少可能会报找不到cms初始化数据库文件。  解......