本文实例为大家分享了java抽奖算法,供大家参考,具体内容如下

1. 算法分析 根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,反查落在那个区间上,即为所抽取的奖品。

2. 代码核心算法

public class Arithmetic {

// 放大倍数

private static final int mulriple = 1000000;

public int pay(List prizes) {

int lastScope = 0;

// 洗牌,打乱奖品次序

Collections.shuffle(prizes);

Map prizeScopes = new HashMap();

Map prizeQuantity = new HashMap();

for (Prize prize : prizes) {

int prizeId = prize.getPrizeId();

// 划分区间

int currentScope = lastScope + prize.getProbability().multiply(new BigDecimal(mulriple)).intValue();

prizeScopes.put(prizeId, new int[] { lastScope + 1, currentScope });

prizeQuantity.put(prizeId, prize.getQuantity());

lastScope = currentScope;

}

// 获取1-1000000之间的一个随机数

int luckyNumber = new Random().nextInt(mulriple);

int luckyPrizeId = 0;

// 查找随机数所在的区间

if ((null != prizeScopes) && !prizeScopes.isEmpty()) {

Set> entrySets = prizeScopes.entrySet();

for (Map.Entry m : entrySets) {

int key = m.getKey();

if (luckyNumber >= m.getValue()[0] && luckyNumber <= m.getValue()[1] && prizeQuantity.get(key) > 0) {

luckyPrizeId = key;

break;

}

}

}

if (luckyPrizeId > 0) {

// 奖品库存减一

}

return luckyPrizeId;

}

}

Prize bean

public class Prize {

/**

* 奖品唯一标示

*/

private Integer prizeId;

/**

* 中奖概率

*/

private BigDecimal probability;

/**

* 奖品数量

*/

private Integer quantity;

public Integer getPrizeId() {

return prizeId;

}

public void setPrizeId(Integer prizeId) {

this.prizeId = prizeId;

}

public BigDecimal getProbability() {

return probability;

}

public void setProbability(BigDecimal probability) {

this.probability = probability;

}

public Integer getQuantity() {

return quantity;

}

public void setQuantity(Integer quantity) {

this.quantity = quantity;

}

}

3. 测试

prize1概率: 5%

prize2概率: 10%

prize3概率: 15%

prize4概率: 20%

prize5概率: 50%

public class Test {

public static void main(String[] args) {

List prizes = new ArrayList();

Prize prize1 = new Prize();

prize1.setPrizeId(1);

prize1.setProbability(new BigDecimal(0.05));

prize1.setQuantity(1);

prizes.add(prize1);

Prize prize2 = new Prize();

prize2.setPrizeId(2);

prize2.setProbability(new BigDecimal(0.10));

prize2.setQuantity(10);

prizes.add(prize2);

Prize prize3 = new Prize();

prize3.setPrizeId(3);

prize3.setProbability(new BigDecimal(0.15));

prize3.setQuantity(20);

prizes.add(prize3);

Prize prize4 = new Prize();

prize4.setPrizeId(4);

prize4.setProbability(new BigDecimal(0.20));

prize4.setQuantity(50);

prizes.add(prize4);

Prize prize5 = new Prize();

prize5.setPrizeId(5);

prize5.setProbability(new BigDecimal(0.50));

prize5.setQuantity(200);

prizes.add(prize5);

int prize1GetTimes = 0;

int prize2GetTimes = 0;

int prize3GetTimes = 0;

int prize4GetTimes = 0;

int prize5GetTimes = 0;

Arithmetic arithmetic = new Arithmetic();

int times = 1000;

for (int i = 0; i < times; i++) {

int prizeId = arithmetic.pay(prizes);

switch (prizeId) {

case 1:

prize1GetTimes++;

break;

case 2:

prize2GetTimes++;

break;

case 3:

prize3GetTimes++;

break;

case 4:

prize4GetTimes++;

break;

case 5:

prize5GetTimes++;

break;

}

}

System.out.println("抽奖次数" + times);

System.out.println("prize1中奖次数" + prize1GetTimes);

System.out.println("prize2中奖次数" + prize2GetTimes);

System.out.println("prize3中奖次数" + prize3GetTimes);

System.out.println("prize4中奖次数" + prize4GetTimes);

System.out.println("prize5中奖次数" + prize5GetTimes);

}

}

结果:

通过1000次抽取,我们看出算法精度还是很高的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java 抽奖算法_Java抽奖算法第二例相关推荐

  1. java基础排序_Java排序算法-Java入门|Java基础课程

    1. 课程目标排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2 ...

  2. java 抽奖算法_Java抽奖概率算法 - hejunbinlan的个人空间 - OSCHINA - 中文开源技术交流社区...

    摘要: 序号 奖品名称 奖品编号 抽到的概率 1 再来一次 P1 0.2 2 本站VIP一年 P2 0.1 3 谢谢参与 P3 0.4 4 50金币 P4 0.3 5 Iphone 6 P5 0.0 ...

  3. java中奖率算法_Java抽奖概率算法

    序号 奖品名称 奖品编号 抽到的概率 1 再来一次 P1 0.2 2 本站VIP一年 P2 0.1 3 谢谢参与 P3 0.4 4 50金币 P4 0.3 5 Iphone 6 P5 0.0 6 Ip ...

  4. java常见的算法_Java常用算法总结(转)

    交换排序 冒泡排序 将最后一个元素与倒数第二个元素对比,如果最后一个元素比倒数第二个小,则交换两个元素的位置,再用倒数第二个元素与倒数第三个元数对比,直到比到第一个元素,这样经过第一趟排序后得到第一个 ...

  5. java 比较算法_JAVA排序算法实现和比较:冒泡,桶,选择,快排,归并

    一.冒泡排序: 实现思想: 重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换,也 ...

  6. java 算法_JAVA经典算法40题

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...

  7. linux公社 java算法_Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  8. java与算法_Java与算法之(1) - 冒泡排序

    冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来. 例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3 因为是从小到大排序,4和3 ...

  9. java程序两点之间最短路径算法_java 最短路径算法 如何实现有向 任意两点的最短路径...

    展开全部 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节e68a8462616964757a686964616f31333361316131点的最短路径.主要 ...

最新文章

  1. POJ 1410 Intersection
  2. 2016-04-28
  3. 如何用XGBoost做时间序列预测?
  4. OPENCV图像数据类型
  5. 计算机视觉工具包Luminoth
  6. c语言实验题数组逆序,【C语言】利用栈将数组中字符串逆序
  7. python最简单的wsgi例子
  8. 使用openssl生成PEM格式私钥和公钥及ECDSA签名
  9. keil uVision4 创建项目
  10. [笔记]使用API函数 GetACP 获取Windows系统当前代码页
  11. 如何在网页中播放FLV文件的代码
  12. 在Anylogic建立自己的智能体
  13. 201671030107词频统计软件项目报告
  14. mysql中日期相减_一篇文章,搞定Excel表格中日期计算,内含公式详解!
  15. 华为手机Android studio 配置ADB wifi 调试
  16. php阿里支付回调逻辑,php 银联支付回调
  17. 使用原生js写一个简单的注册登录页面
  18. python numpy读取数据_numpy中以文本的方式存储以及读取数据方法
  19. 深度学习之从Python到C++
  20. 听诊器的基本构造及其特征

热门文章

  1. java编辑2048小游戏_Java 制作命令行版 2048小游戏
  2. ANSYS FLUENT 超临界流体变物性 UDF
  3. Windows计算器的制作(C#)
  4. 笔记本 数学计算机,Windows计算器大更新 这功能真是太有用了
  5. Outlook定时/延时发送邮件
  6. [诈骗]“中国移动”发送诈骗短信,china mobile 是骗子吗?
  7. 用Python写了一个获取摄像头照片的软件
  8. 信息安全学习笔记(四)------网络后门与网络隐身
  9. CenterNet环境配置No module named '_ext'问题
  10. 电子书下载:ASP.NET 2.0 Revealed.chm