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

指定概率随机数实现

作者: 某某程序员_ | 来源:发表于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
请输入随机次数:

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

相关文章

  • 指定概率随机数实现

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

  • Axure教程-模拟猜拳

    【效果:AB双方猜拳时出现石头、剪刀或布为等概率事件】 【math.random:生成指定范围数值的随机数,即ma...

  • unity3d随机指定范围指定数量的数

    随机指定范围指定数量的随机数

  • 一道概率问题的面试题

    实现要骰子的函数(其中1,2,3,4,5的概率为10%,6的概率为50%)? 思路:利用随机数,取1-10个数,每...

  • Pseudo-random algorithm: prd and

    计算机产生的大多数随机数都是伪随机数。是按照分布概率产生随机数字的过程,数字在概率分布上满足随机要求,但实际上是计...

  • 实现指定概率的随机事件

    在开发中,经常遇到一个需求,给一些事件,并指定这些事件出现的概率。例如:A:10%,B:20%, C:30%,D:...

  • R与统计

    用R实现:产生100个N(50,25)随机数,并给出其描述性统计量,画出正态分布概率图

  • Golang生成随机数的方法总结

    生成区间随机数 生成指定区间随机数(包括纯数字/纯字母/随机)

  • Python笔记:Numpy常用方法-2

    Numpy随机函数 # 指定随机数种子,相同的随机数种子,生成相同的随机数 np.random.seed(10) ...

  • 01发生器产生均匀分布

    题目 1.有一个随机数发生器,能以概率p生成0,以概率1-p生成1,问如何做一个随机数发生器,使得生成0和1的概率...

网友评论

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

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