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