rand5()产生rand7() 方法总结
方法一(代码见:rand7ByRand5Function1):
1、先用rand5()产生一个1-4的随机数(即如果产生5的话就重新再产生)
2 、如果产生的是1,有他负责产生1或2 即再用rand5()产生个1或0的随机数+1
如果产生的是2,有他负责产生3或4 即再用rand5()产生个1或0的随机数+3
........
如果产生的是4,有他负责产生7或8 即再用rand5()产生个1或0的随机数+4
3、如果产生了8就再回到1直到不是8为止。
方法二(代码见:rand7ByRand5Function2):
1、用二进制,不多讲解。
方法三(代码见:rand7ByRand5Function3):
1、先得到1-10的平均分布
2、如果不在范围内,重新生成。
public class ChangeRand {
/**
* 功能:
* 作者:徐俊伟
* 时间:2012-11-19下午08:19:31
* @param args
* 返回值类型:void
*/
public static void main(String[] args) {
int []a=new int[10];
int []b=new int[10];
int []c=new int[10];
int count=1000000;
int temp;
int i;
System.out.println("方法一验证:");
for(i=0;i<count;i++){
temp=rand7ByRand5Function1();
a[temp]=a[temp]+1;
}
for(i=1;i<8;i++){
System.out.println("产生"+i+"的次数为:"+a[i]+"概率为:"+a[i]*1.0/count);
}
System.out.println("方法二验证:");
for(i=0;i<count;i++){
temp=rand7ByRand5Function2();
b[temp]=b[temp]+1;
}
for(i=1;i<8;i++){
System.out.println("产生"+i+"的次数为:"+b[i]+"概率为:"+b[i]*1.0/count);
}
System.out.println("方法三验证:");
for(i=0;i<count;i++){
temp=rand7ByRand5Function2();
c[temp]=c[temp]+1;
}
for(i=1;i<8;i++){
System.out.println("产生"+i+"的次数为:"+c[i]+"概率为:"+c[i]*1.0/count);
}
}
/**
*
* 功能:有rand5产生rand7 方法一
* 作者:徐俊伟
* 时间:2012-11-19下午09:16:13
* @return
* 返回值类型:int
*/
public static int rand7ByRand5Function1(){
int temp=rand5();
while(temp==5){
temp=rand5();
}
switch(temp){
case 1:{
temp=randByRand5()+2*temp-1;break;
}
case 2:{
temp=randByRand5()+2*temp-1;break;
}
case 3:{
temp=randByRand5()+2*temp-1;break;
}
case 4:{
temp=randByRand5()+2*temp-1;break;
}
}
if(temp==8){
return rand7ByRand5Function2();
}
else{
return temp;
}
}
/**
*
* 功能:有rand5产生rand7 方法二
* 作者:徐俊伟
* 时间:2012-11-19下午08:45:37
* @return
* 返回值类型:int
*/
public static int rand7ByRand5Function2(){
int tmep=4*randByRand5()+2*randByRand5()+randByRand5();
while(tmep==0){
tmep=4*randByRand5()+2*randByRand5()+randByRand5();
}
return tmep;
}
/**
*
* 功能:有rand5产生rand7 方法三
* 作者:徐俊伟
* 时间:2012-11-19下午08:45:37
* @return
* 返回值类型:int
*/
public static int rand7ByRand5Function3(){
int temp=2*rand5()+randByRand5();
while(temp<1||temp>7){
temp=rand7ByRand5Function3();
}
return temp;
}
public static int randByRand5(){
int temp=rand5();
while(temp==5){
temp=rand5();
}
return temp%2;
}
/**
*
* 功能:产生1-5的随机数
* 作者:徐俊伟
* 时间:2012-11-19下午08:33:56
* @return
* 返回值类型:int
*/
public static int rand5(){
double temp=Math.random();
return ((int) (temp*10))%5+1;
}
}