给定一个能生成等概率1-5随机数的函数,请你写一个自定义函数生成等概率1-7的随机数
思路:我们要得到1-7,那么只要得到(0-6)+1即可,(1-5)转换为(0-4)
,那问题就是怎么把(0-4)转换为(0-6)的问题了
思路一:
//给定函数,随机生成1-5
public static int f(){
return (int)(Math.random()*5)+1;
}
//随机生成0-4
public static int a(){
return f()-1;
}
//随机生成0-24
//我们就可以分为三块等概率0-6和21,22,23,34
//0-6,7-13,14-20, 21,22,23,24
public static int b(){
return a()*5+a();
}
//随机生成1-7
public static int g(){
int t=0;
do{
t=b();
}while(t>20);
//do-while作用就是当b()生成21,22,23,24时重新执行do里的方法
return t%7+1;
}
思路2:
由(0-5)转换为(0-1),再由(0-1)去生成(0-6)
//给定函数,随机生成1-5
public static int f(){
return (int)(Math.random()*5)+1;
}
// 利用f()函数生成等概率0-1的随机数
public static int q(){
int m=0;
do {
m=f();
}while (m==3);
//把1-5分为1-2,3,4-5
return m<3 ? 0:1;
}
//利用0-1生成0-6,在加1就是1-7
public static int g2(){
int m=0;
do {
m=q()<<2+q()<<1+q();
//q()<<2= 0-4
//q()<<1= 0-2
//q() = 0-1
}while (m==7);
return m+1;
}