需求:根据目标的权重,获取目标数据;本例:根据用户Id所占比重,按权重随机获取;可以根据实际需求,修改K的类型,获取所需;
package sl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* 需求 => 根据目标的权重,获取目标数据;
* 本例 => 根据用户Id所占比重,按权重随机获取;可以根据实际需求,修改K的类型;
* @param <K>
* @author panguijia
*/
public class AssignRule<K> {
/**
* 随机规则
*/
public K getRandomUserId( Map<K,Integer> rawMap){
Map<K, List<Integer>> idMapper=new HashMap<>();
int count=0;
for(K k:rawMap.keySet()){
List<Integer> numList=new ArrayList<>();
for(int i=0;i<rawMap.get(k);i++){
count++;
numList.add(count);
}
idMapper.put(k,numList); }
int max=count,min=1;
int rand = (int) (Math.random()*(max)+min);
for(K k:idMapper.keySet()){
for(int v:idMapper.get(k)){
if(v==rand){
return k;
}
}
}
return null;
} /**
* 验证分配规则有效性
* @param args
*/
public static void main(String[] args) {
/**
* key target
* val ratio
*/
Map<Integer,Integer> rawMap=new HashMap<>();
rawMap.put(1,1);
rawMap.put(2,2);
rawMap.put(3,3);
rawMap.put(4,4); Map<Integer,Integer> map=new HashMap<>();
map.put(1,0);
map.put(2,0);
map.put(3,0);
map.put(4,0);
//实例化,目标对象类型
AssignRule<Integer> assignRule=new AssignRule<>();
for(int i=0;i<10000000;i++){
for(int k:map.keySet()){
if(k==assignRule.getRandomUserId(rawMap)){
int v=map.get(k);
map.put(k,v+1);
}
}
}
for(int k:map.keySet()){
System.out.println(k+" = "+map.get(k));
}
}
}

验证结果

1 = 1001348
2 = 1998783
3 = 3000873
4 = 3997947 Process finished with exit code 0
												

Java 根据权重获取数据 基础 极简 准确率高的更多相关文章

  1. java读取excel获取数据写入到另外一个excel

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. java连接外部接口获取数据工具类

    package com.yqzj.util; import org.apache.log4j.LogManager;import org.apache.log4j.Logger; import jav ...

  3. EL表达式获取数据

    EL 全名为Expression Language. EL主要作用 获取数据: •EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数据.(某个web域 ...

  4. 【转】手摸手,带你用vue撸后台 系列四(vueAdmin 一个极简的后台基础模板)

    前言 做这个 vueAdmin-template 的主要原因是: vue-element-admin 这个项目的初衷是一个vue的管理后台集成方案,把平时用到的一些组件或者经验分享给大家,同时它也在不 ...

  5. Flutter实战视频-移动电商-08.Dio基础_伪造请求头获取数据

    08.Dio基础_伪造请求头获取数据 上节课代码清楚 重新编写HomePage这个动态组件 开始写请求的方法 请求数据 .但是由于我们没加请求的头 所以没有返回数据 451就是表示请求错错误 创建请求 ...

  6. .net通过WCF调用java发布的服务,获取数据

    功能描述 java作为后台,连接数据库获取数据,然后发布SOAP services,让.net平台通过WCF进行引用. 实现步骤 1.在项目特定文件夹下,右键->添加服务引用,输入服务的url地 ...

  7. java接口对接——别人调用我们接口获取数据

    java接口对接——别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...

  8. 使用C#利用cmd来调用java jar包获取其中的数据

    其实也很简单,就是在C#中构建一个Process,启动jar包,并且给jar包传递参数 因为我并没有怎么学过JAVA,所以只写了个很小的Demo,就是根据传入的参数获取对应的数据 以下是JAVA De ...

  9. Asky极简教程:零基础1小时学编程,已更新前8节

    Asky极简架构 开源Asky极简架构.超轻量级.高并发.水平扩展.微服务架构 <Asky极简教程:零基础1小时学编程>开源教程 零基础入门,从零开始全程演示,如何开发一个大型互联网系统, ...

随机推荐

  1. 写论文与PPT汇报时matlab图片的背景透明处理

    不少同学在使用Word写论文时,将matlab生成的图保存为jpg格式,然后粘贴到文档中.word背景为纯白色,jpg图的缺点没有显示,实际上会存在很大白边,以及放大后不清晰的问题,很影响PPT展示和 ...

  2. Android [启动方式:standard singleTop singleTask singleInstance]

    栈顶Activity是当前正在显示的. 以A.B举例 1.standard 不同的Activity都存放在同一个栈中,每次创建实例都会堆放到栈顶,逐次返回直至退出. 创建实例B 创建实例A 点击返回时 ...

  3. C#控件及常用属性

    1.窗体(Form) 1.常用属性 (1)Name 属性:用来获取或设置窗体的名称,在应用程序中可通过Name 属性来引用窗体. (2) WindowState 属性: 用来获取或设置窗体的窗口状态. ...

  4. Spring boot 梳理 - Spring boot自动注册DispatcherServlet

    spring boot提供的DispatcherServlet的name就是“dispatcherServlet”. 源码 public ServletRegistrationBean dispatc ...

  5. Spring 梳理-容器(container)

    虽然Spring的组件代码是轻量级的,但它的配置却是重量级的.一开始,Spring用XML配置,而且是很多XML配置.Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显 ...

  6. java架构之路-(SpringMVC篇)SpringMVC主要流程源码解析(上)源码执行流程

    做过web项目的小伙伴,对于SpringMVC,Struts2都是在熟悉不过了,再就是我们比较古老的servlet,我们先来复习一下我们的servlet生命周期. servlet生命周期 1)初始化阶 ...

  7. thinkphp5 模型表关联

    student 表 外键 grade_idgrade 表主键 id在 模型中student表关联方法public function Grade(){ return $this->hasOne(' ...

  8. BMap添加海量点数据,BMap.Point携带数据

    在开发web项目的过程中使用到了百度地图,由于要在地图中画出很多点比较影响加载速度,查看官方文档,发现有提供加载海量点的功能BMap.PointCollection,用这个加快速度,但是官方文档中提供 ...

  9. PHP 微信机器人 Vbot 结合 Laravel 基础入门及实例

    新来了项目,需要能监听指定微信群的消息并进行转发.基于 PHP 7 的 web 微信机器人 Vbot 可以满足需求.Vbot 本质上就是实现了登录网页版微信来进行自动回复.群管理等等操作. githu ...

  10. 终端-Linux命令之非交互SSH密码验证-Sshpass

    Sshpass是使用SSH所谓的"交互式键盘密码身份验证"以非交互方式执行密码身份验证的工具 通俗来说就是 使用ssh密码登录 是需要在连接时手动输入密码的,没办法明文连接,如下图 ...