美文网首页
指定概率随机数实现

指定概率随机数实现

作者: 某某程序员_ | 来源:发表于2019-07-25 22:45 被阅读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
    请输入随机次数:
    

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

    相关文章

      网友评论

          本文标题:指定概率随机数实现

          本文链接:https://www.haomeiwen.com/subject/cuakrctx.html