算法目的:给定一个等概率随机产生1~5的随机数的函数randTo5(),要求产生1~7的随机数函数randTo7
算法要求:不能使用除randTo5()之外的随机机制。
算法实现如下:
package algorithm_database;
public class Random {
public static int randTo5(){
return (int) (Math.random() * 5) + 1;
}
public static int randTo7(){
int num = 0;
do{
num = (randTo5()-1) * 5+randTo5()-1;
}while(num>20); //我们一直do while直到产生一个0到20之间的随机数。并且产生0-20的概率都相同
return num%7+1;
}
public static void main(String[] args){
int x1 = 0;
int x2 = 0;
int x3 = 0;
int x4 = 0;
int x5 = 0;
int x6 = 0;
int x7 = 0;
for(int i=0; i<70;i++){
int randTo = randTo7();
if(randTo==1){
x1++;
continue;
}
if(randTo==2){
x2++;
continue;
}
if(randTo==3){
x3++;
continue;
}
if(randTo==4){
x4++;
continue;
}
if(randTo==5){
x5++;
continue;
}
if(randTo==6){
x6++;
continue;
}
if(randTo==7){
x7++;
}
}
System.out.print(x1+"_"+x2+"_"+x3+"_"+x4+"_"+x5+"_"+x6+"_"+x7);
}
}
算法总结:理解randTo7()这个方法是关键,尤其是循环中的num>20。其他的扩展与之类似,理解了就都可以实现啦。
1、randTo5()等概率随机产生1 2 3 4 5
2、randTo5()-1等概率随机产生0 1 2 3 4
3、(randTo5()-1)*5 等概率随机产生0 5 10 15 20
4、(randTo5()-1)*5 + (randTo5()-1)等概率随机产生0,1,2,3,。。。。。24
5、如果步骤4产生的结果大于20,则重复4
6、步骤5能等概率随机产生0~20 。
懂了吧,多看多想几遍就懂了。