给定一个函数rand5()用其生成等概率的rand7()

8月份遇到的一个面试题,整理了下解法:

/**
 *   题目:给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一样。现
 *   要求使用该函数构造函数rand7(),使函数rand7()可以随机等概率的生成1-7
 *   的整数。
 *   
 *   解题:这种思想是基于,rand()产生[0,N-1],把rand()视为N进制的一位数产生器,
 *   那么可以使用rand()*N+rand()来产生2位的N进制数,以此类推,可以产生3位,
 *   4位,5位...的N进制数。这种按构造N进制数的方式生成的随机数,必定能保证
 *   随机,而相反,借助其他方式来使用rand()产生随机数(如 rand5() + rand()%3 )
 *   都是不能保证概率平均的。 此题中N为5,因此可以使用rand5()*5+rand5()来产生
 *   2位的5进制数,范围就是1到25。再去掉22-25,剩余的除3,以此作为rand7()的
 *   产生器。
 */
public class Rand7 {
	Random random = new Random();
	
	int rand5(){
		return random.nextInt(5) + 1;
	}
	
	/*
	 *   0 5  10 15 20   //5 * (rand5() - 1)
	 *   -------------
	 *   1 6  11 16 21
	 *   2 7  12 17
	 *   3 8  13 18
	 *   4 9  14 19
	 *   5 10 15 20
	 */
	int rand7()
	{
		int x = 0;
		do{
			x = 5 * (rand5() - 1) + rand5();
		}while(x > 21);
		return 1 + x%7;
	}
	
	public static void main(String args[]){
		Rand7 r = new Rand7();
		for (int i = 0; i < 100; i++) {
			System.out.println(r.rand7());
		}
	}
}

 

你可能感兴趣的:(函数)