文章目录

  • 需求背景
  • 设计思路
  • 代码实现
  • 定义奖品及中奖概率
  • 执行抽奖
  • 中奖率测试
  • 测试结果数据


本文逻辑思想比较简单,旨在了解后端如何设计抽奖以及控制抽奖概率。

需求背景

现在奖品池有如下奖品:

序号

名称

中奖率

0

代金券10元

20%

1

代金券50元

14%

2

蓝牙耳机

10%

3

Switch游戏机

5%

4

iPhone 13Pro

1%

5

谢谢参与

50%

需要设计一个抽奖程序,保证最终的抽奖结果近可能贴近每个奖品的中奖率。

设计思路

首先看看现实生活中的抽奖,如大转盘

JAVA实现抽奖程序的体会 java 抽奖程序_JAVA实现抽奖程序的体会

可以看到每个奖品的中奖概率很大程度决定于中奖区域面积占比。

借鉴线下大转盘抽奖思想,是否能应用到我们的抽奖程序里面呢?

JAVA实现抽奖程序的体会 java 抽奖程序_代码实现_02


将上面的圆盘展开可以得到如下图形:

JAVA实现抽奖程序的体会 java 抽奖程序_java_03


即:

  • 在区间[0,20]为抽中【代金券10元】
  • 在区间(20,34]为抽中【代金券50元】
  • 在区间(34,44]为抽中【蓝牙耳机】
  • 在区间(44,49]为抽中【Switch游戏机】
  • 在区间(49,50]为抽中【iPhone 13Pro】
  • 在区间(50,100]为抽中【谢谢参与】

基于以上思路,我们可以生成一个0~100的随机数,判断这个随机数落在哪个区间,即抽中哪个区间的奖品。

代码实现

定义奖品及中奖概率

JAVA实现抽奖程序的体会 java 抽奖程序_java_04

执行抽奖

JAVA实现抽奖程序的体会 java 抽奖程序_代码实现_05

中奖率测试

JAVA实现抽奖程序的体会 java 抽奖程序_java_06

测试结果数据

抽奖1000次

抽奖5000次

抽奖10000次

抽奖20000次

抽奖50000次

抽奖100000次

代金券10元 中奖次数:225,中奖率:22.5%

代金券10元 中奖次数:1080,中奖率:21.6%

代金券10元 中奖次数:2117,中奖率:21.1%

代金券10元 中奖次数:4237,中奖率:21.1%

代金券10元 中奖次数:10517,中奖率:21.0%

代金券10元 中奖次数:20892,中奖率:20.8%

代金券50元 中奖次数:162,中奖率:16.2%

代金券50元 中奖次数:729,中奖率:14.5%

代金券50元 中奖次数:1341,中奖率:13.4%

代金券50元 中奖次数:2756,中奖率:13.7%

代金券50元 中奖次数:6983,中奖率:13.9%

代金券50元 中奖次数:13876,中奖率:13.8%

蓝牙耳机 中奖次数:97,中奖率:9.7%

蓝牙耳机 中奖次数:489,中奖率:9.7%

蓝牙耳机 中奖次数:1015,中奖率:10.1%

蓝牙耳机 中奖次数:1988,中奖率:9.9%

蓝牙耳机 中奖次数:4935,中奖率:9.8%

蓝牙耳机 中奖次数:9993,中奖率:9.9%

Switch游戏机 中奖次数:39,中奖率:3.9%

Switch游戏机 中奖次数:278,中奖率:5.5%

Switch游戏机 中奖次数:500,中奖率:5.0%

Switch游戏机 中奖次数:1032,中奖率:5.1%

Switch游戏机 中奖次数:2421,中奖率:4.8%

Switch游戏机 中奖次数:4914,中奖率:4.9%

iPhone 13Pro 中奖次数:13,中奖率:1.3%

iPhone 13Pro 中奖次数:47,中奖率:0.9%

iPhone 13Pro 中奖次数:109,中奖率:1.0%

iPhone 13Pro 中奖次数:187,中奖率:0.9%

iPhone 13Pro 中奖次数:506,中奖率:1.0%

iPhone 13Pro 中奖次数:1069,中奖率:1.0

谢谢参与 中奖次数:464,中奖率:46.4%

谢谢参与 中奖次数:2377,中奖率:47.5%

谢谢参与 中奖次数:4918,中奖率:49.1%

谢谢参与 中奖次数:9800,中奖率:49.0%

谢谢参与 中奖次数:24638,中奖率:49.2%

谢谢参与 中奖次数:49256,中奖率:49.2%

JAVA实现抽奖程序的体会 java 抽奖程序_设计思路_07


JAVA实现抽奖程序的体会 java 抽奖程序_设计思路_08


JAVA实现抽奖程序的体会 java 抽奖程序_java_09


JAVA实现抽奖程序的体会 java 抽奖程序_JAVA实现抽奖程序的体会_10


JAVA实现抽奖程序的体会 java 抽奖程序_代码实现_11


JAVA实现抽奖程序的体会 java 抽奖程序_java_12


对比一开始理论“中奖率扇形图”可以看出,实际中奖率基本保持稳定且高度接近预期的各奖品中奖率。

相关代码请参考:一个简单的Java抽奖程序