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

本文介绍了一种利用rand5()函数生成1-5范围内等概率随机数的方法,并以此为基础构造出rand7()函数,使其能够生成1-7范围内等概率的随机数。通过构造两位5进制数并排除部分数值,最终实现了rand7()函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值