您的位置:首页 > 其它

带权重的随机算法的快速实现

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  权重随机算法