用Java实现的抽奖算法,如有问题欢迎评论
package org.jeecg.modules.app.wxUtils;
import lombok.Data;
import java.util.*;
public class Utils {
/**
* 抽奖方法
* create time: 2019/7/5 23:08
* @param orignalRates 商品中奖概率列表,保证顺序和实际物品对应
* @return 中奖商品索引
*/
public static int lottery(List<Double> orignalRates) {
if (orignalRates == null || orignalRates.isEmpty()) {
return -1;
}
int size = orignalRates.size();
// 计算总概率,这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : orignalRates) {
sumRate += rate;
}
// 计算每个物品在总概率的基础下的概率情况
List<Double> sortOrignalRates = new ArrayList<Double>(size);
Double tempSumRate = 0d;
for (double rate : orignalRates) {
tempSumRate += rate;
sortOrignalRates.add(tempSumRate / sumRate);
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
sortOrignalRates.add(nextDouble);
Collections.sort(sortOrignalRates);
return sortOrignalRates.indexOf(nextDouble);
}
public static void main(String[] args) {
List<Goods> data=new ArrayList<>();
Goods goods1=new Goods();
goods1.setBili(0.000001);
goods1.setGoodsId("1");
goods1.setGoodsname("电视");
Goods goods2=new Goods();
goods2.setBili(0.22);
goods2.setGoodsId("2");
goods2.setGoodsname("手机");
Goods goods3=new Goods();
goods3.setBili(0.44);
goods3.setGoodsId("3");
goods3.setGoodsname("飞机");
Goods goods4=new Goods();
goods4.setBili(0.339999);
goods4.setGoodsId("3");
goods4.setGoodsname("冰箱");
data.add(goods1);
data.add(goods2);
data.add(goods3);
data.add(goods4);
List<Double> orignalRates = new ArrayList<Double>(data.size());
//把商品比例放进来
for (Goods orignalRate : data) {
orignalRates.add(orignalRate.getBili());
}
Map<String,Integer> map=new HashMap();
for (int i = 0; i <1000000 ; i++) {
int orignalIndex = Utils.lottery(orignalRates);
String name= data.get(orignalIndex).getGoodsname();
if(map.containsKey(name)){
Integer integer = map.get(name);
map.put(name,++integer);
}else{
map.put(name,1);
}
}
System.out.println("我抽奖了一百万次商品出现的概率"+map);
}
}
@Data
class Goods{
private String goodsId;
private String goodsname;
//中奖比例 总和为1
private Double bili;
}