带权重的随机算法的快速实现
2018-02-08 11:44
197 查看
假设为抽奖的情景,现在有好几个奖项,而且权重不相同,权重大的抽到的概率要更大怎么办?
"特等奖":1, "一等奖":2, "二等奖":3, "三等奖":4, "参与奖":5
我们可以抽取一个权重列表{1,2,3,4,5},累加权重和,并给每个奖获设置相应的随机数区间.在权重和的区间内出一个随机数,查找对应随机数区间的所对应的奖就可以了.就是这么简单!
看代码!
public static int getWeightRandom(List<Integer> weights) {
//在权重总和的值区间--索引值 map
Map<Integer, Integer> weightIndex = new TreeMap<>();
int weigntSum = 0;
//遍历权重list,保存在权重总和的值区间--索引值
for (int i = 0; i < weights.size(); i++) {
//上区间值
if(0 == i) {
weightIndex.put(1, 0);
}else {
weightIndex.put(weigntSum+1, i);
}
//下区间值
weigntSum += weights.get(i);
weightIndex.put(weigntSum, i);
}
/*String json = JsonKit.toJson(weightIndex);
System.out.println(json);*/
//生成随机数
Random r = new Random();
int num = r.nextInt(weigntSum) + 1;
//根据生成的随机数获取值区间对应的索引值
RandomUtil util = new RandomUtil();
Integer index = util.getWeightIndex(weightIndex, num);
System.out.println(num + ":" + index+":"+weights.get(index));
//返回带权重的列表索引
return index;
}
private Integer getWeightIndex(Map<Integer, Integer> weightIndex, int num) {
int keyIndex = 0;
//随机数所在的值区间
for (Integer key : weightIndex.keySet()) {
if(num <= key) {
keyIndex = key;
break;
}
}
//找到值区间所在的索引
Integer index = weightIndex.get(keyIndex);
return index;
}
public static void main(String args[]) {
List<Integer> weights = new ArrayList<>();
weights.add(1);
weights.add(2);
weights.add(3);
weights.add(4);
weights.add(5);
for (int i = 0; i < 20; i++) {
getWeightRandom(weights);
}
System.exit(0);
}
"特等奖":1, "一等奖":2, "二等奖":3, "三等奖":4, "参与奖":5
我们可以抽取一个权重列表{1,2,3,4,5},累加权重和,并给每个奖获设置相应的随机数区间.在权重和的区间内出一个随机数,查找对应随机数区间的所对应的奖就可以了.就是这么简单!
看代码!
public static int getWeightRandom(List<Integer> weights) {
//在权重总和的值区间--索引值 map
Map<Integer, Integer> weightIndex = new TreeMap<>();
int weigntSum = 0;
//遍历权重list,保存在权重总和的值区间--索引值
for (int i = 0; i < weights.size(); i++) {
//上区间值
if(0 == i) {
weightIndex.put(1, 0);
}else {
weightIndex.put(weigntSum+1, i);
}
//下区间值
weigntSum += weights.get(i);
weightIndex.put(weigntSum, i);
}
/*String json = JsonKit.toJson(weightIndex);
System.out.println(json);*/
//生成随机数
Random r = new Random();
int num = r.nextInt(weigntSum) + 1;
//根据生成的随机数获取值区间对应的索引值
RandomUtil util = new RandomUtil();
Integer index = util.getWeightIndex(weightIndex, num);
System.out.println(num + ":" + index+":"+weights.get(index));
//返回带权重的列表索引
return index;
}
private Integer getWeightIndex(Map<Integer, Integer> weightIndex, int num) {
int keyIndex = 0;
//随机数所在的值区间
for (Integer key : weightIndex.keySet()) {
if(num <= key) {
keyIndex = key;
break;
}
}
//找到值区间所在的索引
Integer index = weightIndex.get(keyIndex);
return index;
}
public static void main(String args[]) {
List<Integer> weights = new ArrayList<>();
weights.add(1);
weights.add(2);
weights.add(3);
weights.add(4);
weights.add(5);
for (int i = 0; i < 20; i++) {
getWeightRandom(weights);
}
System.exit(0);
}
相关文章推荐
- java实现权重随机算法
- 权重随机算法的java实现
- 权重随机算法的java实现
- 权重随机算法的java实现
- 带权重的随机算法及实现
- 权重随机算法的java实现
- java实现权重随机算法
- java语言实现权重随机算法完整实例
- 优龙BIOS实现快速呈现LOGO的方法 (Trueman)
- Java分别实现冒泡排序、插入排序、快速排序、选择排序、交换排序
- 快速排序,void Qsort(void *base,int nelem,int width, int (*fcmp)(const void *,const void *))的实现。
- DataGrid连接Access的快速分页法(5)——实现快速分页
- 十四、第三章再续:快速选择SELECT算法的深入分析与实现
- 高斯滤波的快速实现
- 排序算法---(4)快速排序---Java实现
- 快速实现MySQL迁移到Redis
- 整数转字符串的一种快速实现
- 快速排序-java实现
- JSP/Servlet初学者 - 快速配置实现
- 快速排序的超简单实现(Java)