rand5()产生rand7()

用只能产生 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

猜你喜欢

转载自blog.csdn.net/qq_39464369/article/details/89813390