生成几率可配置的随机数

从 1-10 中产生若干个随机数,要求每个数字出现的几率可配置。

解决方案:将 1-100 分成 10 段(段的大小可以为 0)。每生成一个 1-100 之间的随机数,就看它落在哪一段。如果是第一段,那么取随机结果为 1,依此类推。这样的话,段的宽度越大,随机数对应该段的几率就越大。下面是代码:

public class ConfigurableRandom {
 
    // 根据指定的几率生成 500 个随机数
    public static void main(String[] args) {
 
        // 数字 1-10 产生的几率分配。加起来应该等于 100
        int[] possibilities = {2, 18, 5, 5, 5, 25, 10, 0, 20, 10};
 
        // 分段
        int[] splitters = new int[11];
        for (int i = 0; i < possibilities.length; i++) {
            splitters[i + 1] = splitters[i] + possibilities[i];
        }
        System.out.println("分段:" + Arrays.toString(splitters));
 
        // 生成随机数并统计生成次数
        int[] counter = new int[10];
        Random r = new Random();
        for (int i = 0; i < 500; i++) {
            int d = (int) (r.nextDouble() * 100) + 1;
 
            for (int j = 0; j < splitters.length - 1; j++) {
                if (d > splitters[j] && d <= splitters[j + 1]) {
                    System.out.printf("%3d", j + 1);
                    counter[j]++;
                    break;
                }
            }
 
            if ((i + 1) % 25 == 0) {
                System.out.println();
            }
        }
 
        System.out.println("\n1~10出现次数统计:" + Arrays.toString(counter));
    }
 
}

某次输出:

分段:[0, 2, 20, 25, 30, 35, 60, 70, 70, 90, 100] 6 9 10 2 10 10 2 9 9 10 
10 2 4 6 7 2 9 6 7 4 6 7 9 2 6 10 7 9 6 2 6 5 2 7 4 2 2 10 4 2 10 7 2 7 
2 10 6 10 2 2 10 9 9 3 10 2 3 6 6 6 9 6 7 10 7 4 2 4 1 6 7 6 6 10 6 9 4 
6 10 3 7 6 3 7 6 3 4 6 1 9 6 2 2 9 6 7 9 9 10 6 9 7 5 3 9 6 9 4 9 6 1 9 
6 9 2 2 9 5 6 6 6 9 6 9 2 9 6 9 10 9 6 2 2 2 2 2 9 6 9 6 10 9 9 2 6 2 4 
9 6 10 6 3 6 7 6 6 6 1 10 6 9 9 5 6 7 9 7 4 2 9 6 9 2 5 2 6 9 7 6 6 9 6 
6 4 5 2 6 5 4 10 6 7 6 9 10 10 5 9 2 10 2 10 6 2 6 9 9 5 6 7 10 6 6 6 4 
2 6 6 9 3 6 2 3 10 10 2 4 2 5 2 2 7 9 9 6 2 7 6 2 10 3 2 2 2 6 2 10 2 6 
9 6 4 2 9 9 10 6 5 5 9 9 2 7 6 10 4 6 2 9 7 4 2 9 6 4 5 2 6 4 6 2 9 9 6 
3 6 9 7 7 2 2 2 6 7 2 10 9 1 6 4 6 9 4 10 10 7 6 6 9 2 9 10 9 5 6 7 1 6 
4 2 2 9 1 9 6 6 2 6 7 9 6 2 2 6 6 5 9 10 10 6 4 2 2 7 4 2 2 9 9 7 9 2 6 
7 6 2 9 6 9 6 5 9 9 6 5 5 10 9 7 7 2 4 3 2 3 10 7 6 9 9 6 6 9 5 6 6 9 2 
9 10 2 7 6 3 5 6 2 2 10 2 1 9 6 3 5 4 4 10 3 7 10 9 9 7 6 7 2 9 6 2 2 2 
9 9 9 9 7 6 4 5 2 9 10 2 2 2 4 6 9 1 6 9 2 2 6 6 9 4 5 2 7 6 6 5 4 2 9 
4 10 7 6 9 10 6 9 2 6 6 6 7 9 5 6 6 7 9 6 7 6 1 2 3 4 6 7 10 6 5 2 6 2 
2 9 10 9 6 9 6 6 7 
1~10出现次数统计:[10, 94, 17, 34, 26, 125, 48, 0, 97, 49]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值