中奖概率算法:
奖品 中奖概率
A 0
B 10
C 1
D 0
E 50
F 39
生成0到99 的区间数 排除中奖概率为 0 和100 的奖项
生成区间数值 B 0-10 C 10-11 E 11-61 F 61-100 <= <
生成 100 随机数 判断在哪个区间 返回哪个奖品
public class TestClass {
public static void main(String[] args) {
int t = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int count = 10000;
for (int i = 0; i < count; i++) {
int random = (int)(Math.random()*100);
if(0<=random&&random<1){
t++;
}else if(1<=random&&random<15){
a++;
}else if(15<=random&&random<30){
b++;
}else if(30<=random&&random<80){
c++;
}else if(80<=random&&random<100){
d++;
}
}
System.out.println(String.format(
"奖品 t 中奖 次数 %s, " +
"奖品 a 中奖 次数 %s, " +
"奖品 b 中奖 次数 %s," +
"奖品 c 中奖 次数 %s," +
"奖品 d 中奖 次数 %s",t,a,b,c,d));
}
}
结果:
奖品 t 中奖 次数 85, 奖品 a 中奖 次数 1510, 奖品 b 中奖 次数 1494,奖品 c 中奖 次数 4954,奖品 d 中奖 次数 1957
bug 版 不预先设置好区间 实时增加 会出问题
public static void main(String[] args) {
int t = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
Map<String, Integer> map = new TreeMap<String, Integer>() {
{
put("a", 10);
put("b", 50);
put("c", 30);
put("d", 9);
put("t", 1);
}
};
int count = 10000000;
for (int i = 0; i < count; i++) {
int cursor = 0;
int probability;
int randomNum = new Random().nextInt(100);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
probability = entry.getValue();
if (cursor <= randomNum && randomNum < (cursor + probability)) {
String key = entry.getKey();
if (key.equals("a")) {
a++;
}
if (key.equals("b")) {
b++;
}
if (key.equals("c")) {
c++;
}
if (key.equals("d")) {
d++;
}
if (key.equals("t")) {
System.out.println(String.format(key +" %s %s ",cursor,cursor+probability));
t++;
}
} else {
cursor += probability;
}
}
}
System.out.println(String.format(
"奖品 a 中奖 概率 %s,\n " +
"奖品 b 中奖 概率 %s,\n" +
"奖品 c 中奖 概率 %s,\n" +
"奖品 d 中奖 概率 %s \n" +
"奖品 t 中奖 概率 %s,", a/100000d, b/100000d, c/100000d, d/100000d, t/100000d));
}
}
结果
奖品 a 中奖 概率 10.01115,
奖品 b 中奖 概率 60.00459,
奖品 c 中奖 概率 70.00794,
奖品 d 中奖 概率 45.03247
奖品 t 中奖 概率 9.99485,
与期望概率不符 分析 原本1% 的 t 增加的原因是 列表map乱序 t的区间 是随机的
![](https://i-blog.csdnimg.cn/blog_migrate/e61210fe331c97474cfb6f87d2471592.png)
t 区间 随机