中奖概率算法

中奖概率算法:


奖品 中奖概率
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的区间 是随机的 
t 区间 随机
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值