游戏Algorithm----抽奖算法----奖品有权重的情况探讨

来源:互联网 发布:js sdk fail 编辑:程序博客网 时间:2024/06/11 00:32

这么考虑的

相当于一个盒子里有好几个颜色的小球,每种颜色的小球有多个,每次取完,小球放回盒子内

/** * 每次取完放回盒内 * @param count 抽奖次数 * @param oddsMap 权值表 * @return */public static <T> List<T> getLuckyDrawPutBack(int count,Map<T,Integer> oddsMap){List<T> list = Lists.newArrayList();SecureRandom rand = new SecureRandom();Map<T,Integer> factorMap = Maps.newHashMap();factorMap.putAll(oddsMap);if(null == factorMap || 0 == factorMap.size()){return list;}int sum = 0 ;for(Integer value : factorMap.values()){sum += value;}if(0 == sum){ return list;}for(int i =0; i<count ;i++){int random = rand.nextInt(sum)+1;//均匀的产生1到SUMint overlapCount = 0; for(Map.Entry<T, Integer> entry:factorMap.entrySet()){T key = entry.getKey() ;int value = entry.getValue() ;if((overlapCount < random) && (random <= (overlapCount+ value))){list.add(key);break;}overlapCount += value;}//for}return list;}

每次取完不放回盒内的情况

/** * 每次取完不放回盒内 * 抽取必有奖,奖可重复 * @param count 抽奖次数 * @param oddsMap * @return */public static <T> List<T> getLuckyDrawNobBack(int count,Map<T,Integer> oddsMap){List<T> list = Lists.newArrayList();SecureRandom rand = new SecureRandom();Map<T,Integer> factorMap = Maps.newHashMap();factorMap.putAll(oddsMap);if(null == factorMap || 0 == factorMap.size()){return list;}int sum = 0 ;for(Integer value : factorMap.values()){sum += value;}if(0 == sum){ return list;}for(int i =0; i<count ;i++){int random = rand.nextInt(sum)+1;//均匀的产生1到SUMint overlapCount = 0; for(Iterator<Map.Entry<T, Integer>> it = factorMap.entrySet().iterator();it.hasNext();){Map.Entry<T, Integer> entry = it.next();T key = entry.getKey() ;int value = entry.getValue() ;if((overlapCount < random) && (random <= (overlapCount+ value))){list.add(key);/*  * 要取得不重复结果的方法 * it.remove(); * sum -= value; */sum -= 1; //不放回盒内,个数减一entry.setValue(value-1);//break;}overlapCount += value;}//for}return list;}


0 0
原创粉丝点击