重造轮子-random5到random7

目标:有一个rand5函数可以随机产生0~4这5个数,设计一个rand7函数,利用这个rand5函数随机产生0~6这7个数。

方法:面试这一题,第一想法就是要用编码的思想。那么想表达完所有的7个数需要调用两次rand5函数,因为调用两次rand5函数可以产生的组合为5*5个组合。那么在看看

rand5()产生0,1,2,3,4,

rand5()*5产生0,5,10,15,20

发现rand5()*5+rand5()刚好可以产生从0~24这全部的25个数,因此方法出来了,利用上面的方法产生一个新的数,如果这个数大于20,那么重新再产生一次。否则直接将产生的数除以3就得到对应的数。

代码

class Solution{
public:
	int rand7(){
		int ran;
		while((ran = rand5()*5+rand5())>=21);//如果产生的数大于20那么就重复再取数
		return ran/3;//比如0,1,2除以3则对应数字0,因此直接将结果除以3
	}
private:
	int rand5(){
		return rand()%5;//产生[0,4]范围的随机整数
	}
};


再补充一下:

C++中没有random()函数,C中调用stdlib.h头文件则可以使用random(n)函数,这个函数返回0到n-1之间的随机整数。C++中只有rand()函数,这个函数返回0到MAX_INT之间的随机整数。如果要取某个区间的随机整数方法如下,

取[a,b)之间的数,(rand()%(b-a))+a

取[a,b]之间的数,(rand()%(b-a+1))+a

取(a,b]之间的数,(rand()%(b-a))+a+1

这下面的是从网友那里摘录的

通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 
要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。 
要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值