算法原理:

对0到1的区间进行分块,分块的依据是物品占整体的比重,从随机数种子中产生0-1中间的某个个数,判断该数落在哪个区间,并相应地提取出该物品。 随机数在理论上概率均等,产生的各数量在理论上也应该概率均等,相应区间所含数量的多少体现了抽签物品概率的差异。 如果概率是0,则该区间也就是0,不会落入该区间。 最终,会返回对应的商品信息。

奖品类

/**奖品类*/@ data @ allargsconstructorpublicclassprize {/* * *奖品编号*/private Integer prizeIndex; /** *奖品id */private Long prizeId; /**奖项名称*/private String prizeName; /** *库存* /专用集成器堆栈; /**概率* /私有双隐私; } 抽奖算法工具类

/**抽奖算法工具类* * @ authorxiegege * @ date 2021/1/717336002 */publicclasslotteryutil {/* * *抽奖算法* @ param oriution/publicstaticintlottery (listdoubleoriginrates ) /计算总概率可以保证总概率不一定等于1 double sumRate=0d; 双速率:原始速率({ sum rate=rate; //根据各项的总概率计算概率时listdoublesortoriginrates=new ArrayList (; 双精度时间速率=0d; 双速率:原始速率(for ) { tempSumRate =rate; sortoriginrates.add (时间周期速率/和速率; //从块值中提取的项目索引double nextDouble=Math.random (; sortoriginrates.add (下一个双精度; collections.sort (sortoriginrates; returnsortoriginrates.index of (下一个双精度); }} 调用

/** *以不同概率抽签* * @ authorxiegege * @ date 2021/1/517:02 */publicclasslotterytest { publicstaticvoidmain [ ] at ring prizes.add (new prize (1234,22l,’本站VIP一年’,20,0.1d ) ); prizes.add (new prize (5678,33l,’谢谢您的参与’,- 1,0.4d ) ); prizes.add (new prize (1230,55l,’ 50金币’,0,0.3d ); prizes.add (new prize (3726,66l,’ iphone12 ‘,0,0d ); prizes.add(newprize ) 3737,77l,’ ipad Air8’,0,-0.1d ); Prizes.add(newprize ) 2568,88l,’ 100元手机资费’,5,0.008 d ); if (collection utils.isempty (prizes ) ) { System.out.println (“无奖品数据”); 返回; } listdoubleoriginrates=new ArrayList (; for(prizeprize3360prizes ) double probability=prize.get probability (; int stock=prize.getStock (; //概率为负或库存为0的数据,概率设置为0if(probability0||stock==0) { probability=0。 } origin rates.add (可移植性; //测试1000次抽奖呼叫for(intI=0; i 1000; I ) intoriginindex=lottery util.lottery (origin rates ); prize prize=prizes.get (原始索引); if (prize.get probability (=0||prize.get stock )==0) (System.out.println ) ‘判断为库存不足或概率为0======以下} }库存为0或概率为0以下时,奖品不能抽签。 这里的测试代码没有扣除库存。 在实际开发中必须进行库存扣除的操作。 另外,根据用户的不同,可以拉多少次,在什么条件下可以拉多少次,这些逻辑可以根据自己的业务需求来增加。

如果你觉得总结得好,可以称赞收藏,关注博客。 谢谢你给我读!