【java】根据指定概率,实现概率随机分布

【java】根据指定概率,实现概率随机分布

实体类【RandomTest】
package com.snailDream;

public class RandomTest {
    String name;
    //分布概率
    Integer probability;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getProbability() {
        return probability;
    }

    public void setProbability(Integer probability) {
        this.probability = probability;
    }

    @Override
    public String toString() {
        return "RandomTest{" +
                "name='" + name + '\'' +
                ", probability=" + probability +
                '}';
    }
}

随机算法类【WeightFifter】
package com.snailDream;
import java.util.List;
public class Weight {
	//Dubbo中基于权重的随机算法
    public static Integer WeightFifter(List<RandomTest> list){
        //获取list的权重总数
        Integer weight = list.stream().mapToInt(RandomTest::getProbability).sum();
        //在总权重中抽取随机样本
        int random=(int)Math.floor(Math.random() * weight);
        for (Integer j = 0 ; j < list.size() ; j ++){
        	//如果随机样本 < 对象[j] 中指定的概率数值,则认为此次随机 命中在对象[j]上
            if (random - list.get(j).getProbability()<0){
                return j;
            //如果随机样本 > 对象[j] 中指定的概率数值 ,则认为此次随机 未命中在对象[j]上 ,刷新随机样本,继续下次循环
            }else{
                random -= list.get(j).getProbability();
            }
        }
        return null;
    }
    }
测试类
public static void main(String[] args) {
        RandomTest randomTestA = new RandomTest();
        randomTestA.setName("A10概率");
        randomTestA.setProbability(10);
        RandomTest randomTestB = new RandomTest();
        randomTestB.setName("B30概率");
        randomTestB.setProbability(30);
        RandomTest randomTestC = new RandomTest();
        randomTestC.setName("C60概率");
        randomTestC.setProbability(60);

        List<RandomTest> list = new ArrayList<>();
        list.add(randomTestA);
        list.add(randomTestB);
        list.add(randomTestC);

        Integer a=0;
        Integer b=0;
        Integer c=0;
        Integer k = 1000;
        for (int i = 0 ; i < k ; i++){
            Integer pro = list.get(Weight.WeightFifter(list)).getProbability();
            if (pro == 10) {a+=1;continue;}
            if (pro == 30) {b+=1;continue;}
            if (pro == 60) {c+=1;continue;}
        }
        System.out.println(k+"次内 ,10% 概率出现:"+ a);
        System.out.println(k+"次内 ,30% 概率出现:"+ b);
        System.out.println(k+"次内 ,60% 概率出现:"+ c);
    }
测试结果
#第一次
1000次内 ,10% 概率出现:96次
1000次内 ,30% 概率出现:321次
1000次内 ,60% 概率出现:583次
#第二次
1000次内 ,10% 概率出现:112次
1000次内 ,30% 概率出现:291次
1000次内 ,60% 概率出现:597次
#第三次
1000次内 ,10% 概率出现:105次
1000次内 ,30% 概率出现:303次
1000次内 ,60% 概率出现:592次
#第四次
1000次内 ,10% 概率出现:108次
1000次内 ,30% 概率出现:308次
1000次内 ,60% 概率出现:584次
#第五次
1000次内 ,10% 概率出现:94次
1000次内 ,30% 概率出现:307次
1000次内 ,60% 概率出现:599次
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值