指定概率随机数实现

2019-07-25  本文已影响0人  某某程序员_

在实际开发中,经常会遇见指定概率随机数得到某一个值。比如取到某个值的概率百分之几,取到另一个值的概率百分之几。
可以使用如下实现:

    public static void  main(String[] args){
        //假设:有A\B\C 三个选项,实现随机取值:A的概率20% B的概率30% C的概率50%

        //初始化包含一百个元素的列表,这里可以是 10个,100个,1000个,越大随机值越真实
        //设置长度确保 1% 至 100% 每一个值都存在
        List<String> strings = new ArrayList<>(100);
        for (int i = 0; i < 100; i++) {
            if (i <20){
                strings.add("A");
            }else if (i<50){
                strings.add("B");
            }else {
                strings.add("C");
            }
        }
        out.println("乱序前:" + strings.toString());
        Collections.shuffle(strings);//打乱顺序,随机性更强
        out.println("乱序后:" + strings.toString());

        Random random = new Random();
        Scanner sc = new Scanner(System.in);
        int n = 0;
        while (n > -1){
            out.println("请输入随机次数:");
            n = sc.nextInt();
            out.println("随机次数=" + n);
            int ACount = 0;
            int BCount = 0;
            int CCount = 0;
            for (int i = 0; i < n; i++) {
                int index = random.nextInt(100);//随机取数区间[0,100)
                if (strings.get(index).equals("A")){//随机到A值
                    ACount++;
                }else if (strings.get(index).equals("B")){//随机到B值
                    BCount++;
                }else if (strings.get(index).equals("C")){//随机到C值
                    CCount++;
                }
            }

            //使用BigDecimal计算,可以设置比值的精确度,本例取两位精度
            out.println("A rate = " + BigDecimal.valueOf(Integer.valueOf(ACount).doubleValue()).divide(BigDecimal.valueOf(Integer.valueOf((ACount + BCount + CCount))), 2, RoundingMode.HALF_UP));
            out.println("B rate = " + BigDecimal.valueOf(Integer.valueOf(BCount).doubleValue()).divide(BigDecimal.valueOf(Integer.valueOf((ACount + BCount + CCount))), 2, RoundingMode.HALF_UP));
            out.println("C rate = " + BigDecimal.valueOf(Integer.valueOf(CCount).doubleValue()).divide(BigDecimal.valueOf(Integer.valueOf((ACount + BCount + CCount))), 2, RoundingMode.HALF_UP));
        }
    }

运行结果如下:

乱序前:[A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C]
乱序后:[A, B, B, B, B, C, B, C, C, A, C, C, C, A, C, C, C, B, B, C, A, C, C, A, C, B, B, A, C, A, A, B, C, C, B, A, B, C, C, B, C, A, C, B, C, C, B, C, C, C, C, A, C, C, B, C, C, A, B, B, B, C, C, C, C, B, B, B, C, C, C, C, C, C, C, A, B, C, C, B, C, C, C, A, A, B, B, A, A, C, A, A, B, A, B, C, C, B, B, C]
请输入随机次数:
100
随机次数=100
A rate = 0.24
B rate = 0.30
C rate = 0.46
请输入随机次数:
1000
随机次数=1000
A rate = 0.17
B rate = 0.32
C rate = 0.52
请输入随机次数:
100000
随机次数=100000
A rate = 0.20
B rate = 0.30
C rate = 0.50
请输入随机次数:
1000000
随机次数=1000000
A rate = 0.20
B rate = 0.30
C rate = 0.50
请输入随机次数:

可以发现,取值次数越多,比率越接近指定值。

上一篇下一篇

猜你喜欢

热点阅读