本文借鉴广大博主的精髓,根据自己的需要经过加工。
表结构
CREATE TABLE `problit` ( `id` int(11) AUTO_INCREMENT, `code` int(11) DEFAULT NULL COMMENT '奖品编号', `name` varchar(32) DEFAULT NULL COMMENT '奖品名称', `problit` varchar(10) DEFAULT NULL COMMENT '概率', `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`) ) ENGINE=InnoDB CHARSET=utf8 COMMENT='概率表';
实体类自行编写这里不提供, 算法:
package com.***.utils; import com.***.entity.Problit; import java.util.ArrayList; import java.util.List; /** * 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率 * @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品) */ public class PrizeProblitUtils { public static String run(List<Problit> problits) { ArrayList<String> random = new ArrayList<String>(); try{ //产生随机数 double randomNumber = 0.0; //防止中奖率为0的奖品被抽中 for (int i = 0; i < 10; i++) { if(randomNumber <= 0.0) { randomNumber = Math.random(); } else { break; } } //根据随机数在所有奖品分布的区域并确定所抽奖品 double d1 = 0; double d2 = 0; for(int i=0;i<problits.size();i++){ d2 += Double.valueOf(problits.get(i).getProblit()); if(i==0){ d1 = 0; }else{ d1 += Double.valueOf(problits.get(i-1).getProblit()); } if(randomNumber >= d1 && randomNumber <= d2){ random.add(problits.get(i).getCode()); } } }catch(Exception e){ System.out.println("生成抽奖随机数出错,出错原因:" +e.getMessage()); } int resultIndex = 0; if (random.size() > 1) { java.util.Random rIndex =new java.util.Random();// 定义随机类 resultIndex = rIndex.nextInt(rIndex.size());// 返回[0,size)集合中的整数,注意不包括size } return random.get(resultIndex); } }
24729total visits,1visits today
Leave a Reply