//三个二进制位的随机整数

package c;

/**
 * @author 真他喵的学不动咯
 * @create 2022-08-07--15:39
 */
public class Threebitsofbinary {   //三个二进制位的随机整数
    //0~6   需要三个二进制位   分别独立调用3个f2()
    public static void main(String[] args){
        int[] counts=new int[8];
        int tesTimes=100000;
        for (int i=0;i<tesTimes;i++){
            int num=f4();   //num为0~7的随机整数
            counts[num]++;  //num相当于索引,counts[0]、counts[2]、counts[3],把每种数字对应的数加一遍
            // counts[num]相当于一个包含了各个数字的计数器
        }
        for (int i=0;i<8;i++){  //i是0~7
            System.out.println(i+"这个数出现了"+counts[i]+"次");
        }

        System.out.println("****************************************");
        int[] countss=new int[8];
        for (int i=0;i<tesTimes;i++){
            int num=g();   //num为0~7的随机整数
            countss[num]++;  //num相当于索引,counts[0]、counts[2]、counts[3],把每种数字对应的数加一遍
            // counts[num]相当于一个包含了各个数字的计数器
        }
        for (int i=0;i<8;i++){  //i是1~7
            System.out.println(i+"这个数出现了"+counts[i]+"次");
        }
    }
    //f2是01发生器、f1\f3\f4是返回一个随机整数

    //f1()返回随机整数  0~5
    public static int f1(){
        return (int)(Math.random()*5)+1;
    }
    //f2()是01发生器  f2()事实上就是一个1bit的01发生器
    public static int f2(){
        int ans=0;
        do {
            ans=f1();
        }while (ans==3);//如果ans等于3,那就重新产生随机整数
        return ans<3? 0:1;
    }
    //f3()实现0~7等概率返回一个  得到000~111  等概率
    public static int f3(){
        return (f2()<<2)+(f2()<<1)+(f2()<<0);//产生3位的01二进制  000~111
    }
    //f4() 产生0~6  等概率返回
    public static int f4(){
        int ans=0;
        do {
            ans=f3();  //产生0~7
        }while (ans==7);//如果得到7那就重新做,只需要0~6
        return ans;//此处不是return ans<=3? 0:1;
        //而是return ans
    }
    //g()  产生0~7 等概率返回
    public static int g(){
        return f4()+1;  //等概率得到 1~7
    }
    //如果实现3-19等概率返回数字,就把他们从中间分开,一半为0,一半为1,把中间那一个数重新分配概率
    //如果实现17-56,那么可以通过实现0~39等概率返回,再在0~39加17,得到17-56等概率返回
    //如果实现0~39,通过01发生器实现0~63,通过6位01发生器,把40~63的概率重新分配,从而产生0~39的等概率分配

}
//day2 "01:34:31

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值