设计一个抽奖系统,奖品123,概率分别为1%,2%,3%,具体讲一下怎么设计
2026/5/9大约 2 分钟面试题面试题
1. 奖品及概率设计
假设奖品列表如下:
奖品ID
奖品名称
概率(%)
1
奖品1
1%
2
奖品2
2%
3
奖品3
3%
剩下的94%为未中奖。
2. 概率实现思路
常见做法:区间加权随机
- 以10000为单位(更高精度),把概率分配到一个[1, 10000]的区间上。
- 奖品1占100(1%),奖品2占200(2%),奖品3占300(3%),剩下9400为未中奖。
实现步骤
- 构建奖品区间
- 奖品1:1 ~ 100
- 奖品2:101 ~ 300
- 奖品3:301 ~ 600
- 未中奖:601 ~ 10000
- 抽奖算法
- 随机生成一个1~10000的整数N
- 判断N落在哪个区间就中哪个奖品,否则为未中奖
3. 数据结构设计示例
奖品配置表(支持动态配置)
id
name
probability
weight区间 (自动生成)
1
奖品1
0.01
1-100
2
奖品2
0.02
101-300
3
奖品3
0.03
301-600
实体代码结构简单示范(伪代码)
prizes = [
{"id": 1, "name": "奖品1", "start": 1, "end": 100},
{"id": 2, "name": "奖品2", "start": 101, "end": 300},
{"id": 3, "name": "奖品3", "start": 301, "end": 600}
]4. 抽奖逻辑流程
- 读取奖品配置,自动累计概率分配权重区间。
- 用户点击抽奖时:生成随机数R。
- 区间查找(可二分查找优化):哪个区间包含R,给哪个奖品。
- 概率没覆盖的区间就是未中奖。
示例:
import java.util.Random;
public class Main {
public static void main(String[] args) {
System.out.println(draw());
}
public static String draw() {
Random random = new Random();
int n = random.nextInt(10000) + 1; // 生成1到10000之间的随机数
if (n >= 1 && n <= 100) {
return "奖品1";
} else if (n >= 101 && n <= 300) {
return "奖品2";
} else if (n >= 301 && n <= 600) {
return "奖品3";
} else {
return "未中奖";
}
}
}