java 权重随机算法实现
import java.util.*;
/**
* 权重随机算法实现
* a b c d 对应权重范围 --- [0,1)、[1,3)、[3,6)、[6,10)
*/
public class RandomSF {
private static TreeMap<String, Integer> hm = new TreeMap<>();
public static void main(String[] args) throws Exception {
TreeMap<String, Integer> randomMap = new TreeMap<String, Integer>();
randomMap.put("a", 1);
randomMap.put("b", 2);
randomMap.put("c", 3);
randomMap.put("d", 4);
Integer tmp = 0;
ArrayList<ElementWeight> arr = new ArrayList<ElementWeight>();
for (Map.Entry<String, Integer> entry : randomMap.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
ElementWeight ew = new ElementWeight(key, tmp, tmp + value);
tmp += value;
arr.add(ew);
}
Random random = new Random();
for (int j = 0; j < 100000000; j++) {
int i = random.nextInt(tmp);
String randomStr = binarySearch(arr, i);
countRandomStr(randomStr);
}
for (ElementWeight ew:arr) {
System.out.println(ew.getElement()+"的权重范围:"+"["+ew.getLow()+","+ew.getHigt()+")");
}
System.out.println(hm);
}
// 二分查找实现
public static String binarySearch(ArrayList<ElementWeight> arr, int num) {
int high = arr.size();
int low = 0;
while (high >= low) {
int middle = (high + low) / 2;
ElementWeight ew = arr.get(middle);
if (num >= ew.getLow() && num < ew.getHigt()) {
return ew.getElement();
} else if (num >= ew.getHigt()) {
low = middle + 1;
} else if (num < ew.getLow()) {
high = middle - 1;
}
}
return null;
}
// 权重元素实体类
static class ElementWeight {
private String element;
private Integer low;
private Integer higt;
public ElementWeight(String element, Integer low, Integer higt) {
this.element = element;
this.low = low;
this.higt = higt;
}
public String getElement() {
return element;
}
public Integer getLow() {
return low;
}
public Integer getHigt() {
return higt;
}
}
// 统计随机string的个数
public static void countRandomStr(String str) {
Integer value = hm.get(str);
if (value == null) {
hm.put(str, 1);
} else {
hm.put(str, ++value);
}
}
}
java 权重随机算法实现的更多相关文章
- 权重随机算法的java实现
一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果 ...
- java实现权重随机算法
权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: im ...
- 权重随机算法Java实现
权重随机算法在抽奖,资源调度等系统中应用还是比较广泛的,一个简单的按照权重来随机的实现,权重为几个随机对象(分类)的命中的比例,权重设置越高命中越容易,之和可以不等于100: 简单实现代码如下: ? ...
- Java实现 LeetCode 528 按权重随机选择(TreeMap)
528. 按权重随机选择 给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比. 说明 ...
- hdu 4712 Hamming Distance ( 随机算法混过了 )
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- Java数据结构和算法(九)——高级排序
春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...
- Java数据结构和算法 - 链表
Q: 为什么要引入链表的概念?它是解决什么问题的? A: 数组作为数据存储结构有一定的缺陷,在无序数组中,搜索是低效的:而在有序数组中,插入效率又很低:不管在哪一个数组中删除效率都很低:况且一个数组创 ...
- Java数据结构和算法 - 简单排序
Q: 冒泡排序? A: 1) 比较相邻的元素.如果第一个比第二个大,就交换它们两个; 2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数; 3) 针 ...
- Java数据结构和算法 - 数组
Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new ...
随机推荐
- svn hooks post-commit钩子自动部署
#!/bin/sh #修改为服务编码 export LANG=zh_CN.utf- #Set variable REPOS="$1" REV="$2" SVN= ...
- Java第04次实验提纲(面向对象2-继承、多态、抽象类与接口)
PTA 题集面向对象2-进阶-多态接口内部类 第1次实验 1.1 题集5-1(Comparable) 难点:如果传入对象为null,或者传入对象的某个属性为null,怎么处理? 1.2 题集5-2(C ...
- Microsoft.NET.Framework开机报错解决方法
win10自动更新后每次开机都报错Microsoft.NET.Framework. 如下图所示: 网上查了各种各样的方法折腾了好久. 其中看到了这样一个回答 “有两种可能 你电脑里的某个软件需要使用M ...
- Javascript之类型转换(二)
前言 类型转换js中主要有以下几种情况: 1.条件判断时: 2.对象转基本类型时: 3.四则运算时: 4.‘==’操作符比较值时: 5.比较运算符时. 一.条件判断时 在条件判断时,除了 undefi ...
- hadoop fs、hadoop dfs与hdfs dfs的区别
不多说,直接上干货! hadoop fs: 使用面最广,可以操作任何文件系统. hadoop dfs与hdfs dfs : 只能操作HDFS文件系统相关(包括与Local FS间的操作),前 ...
- Spring-framework应用程序启动loadtime源码分析笔记(三)——@KafkaListener
org.springframework.context.annotation.ConfigurationClassParser.getConfigurationClasses()读所有@Configu ...
- docker logs 查看实时日志
docker logs -f -t --since="2017-05-31" --tail=10 edu_web_1 --since : 此参数指定了输出日志开始日期,即只输出指定 ...
- springboot(五)读写分离,多个读库,Druid监控--待整理
1.修改mybatis.properties # 主数据源,默认的 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.d ...
- 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON ...
- Oracle 锁的概念
用scott/orcl登录并且模拟数据 SQL> conn scott/orclConnected.SQL> create table tt(id int primary key); Ta ...