用只能产生 1 2 3 4 5 的随机数产生1 2 3 4 5 6 7
将先后产生的两个随机数拼成一个两位数,共25个,每个数概率相等,分为每3个一组,就有7组数,余下4个垃圾丢弃,利用率84%。
算法代码
public static int random5() {
return (int) (1+Math.random()*5);
}
public static int random7() {
int a=random5();
int b=random5();
int rand=10*a+b;
if(rand<14) {
return 1;//11 12 13
}else if(rand<22) {
return 2;//14 15 21
}else if(rand<25) {
return 3;//22 23 24
}else if(rand<33) {
return 4;//25 31 32
}else if(rand<36) {
return 5;//33 34 35
}else if(rand<44) {
return 6;//41 42 43
}else if(rand<52) {
return 7;//44 45 51
} else
return random7();//52 53 54 55
}
测试代码
public static void main(String[] args) {
HashMap<Integer,Integer> map5=new HashMap<Integer,Integer>();
for(int i=0;i<10000000;i++) {
int key = random5();
if(map5.get(key)==null) {
map5.put(key, 1);
}else
map5.put(key, map5.get(key)+1);
}
System.out.println("random5:");
map5.entrySet().forEach(e->{
System.out.println(e+"\t"+1.0*e.getValue()/10000000);
});
System.out.println();
HashMap<Integer,Integer> map7=new HashMap<Integer,Integer>();
for(int i=0;i<10000000;i++) {
int key = random7();
if(map7.get(key)==null) {
map7.put(key, 1);
}else
map7.put(key, map7.get(key)+1);
}
System.out.println("random7:");
map7.entrySet().forEach(e->{
System.out.println(e+"\t"+1.0*e.getValue()/10000000);
});
}
结果输出
random5:
1=2001046 0.2001046
2=1998832 0.1998832
3=2000206 0.2000206
4=2000254 0.2000254
5=1999662 0.1999662
random7:
1=1429254 0.1429254
2=1427686 0.1427686
3=1429913 0.1429913
4=1428525 0.1428525
5=1426169 0.1426169
6=1430268 0.1430268
7=1428185 0.1428185