目标:有一个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)。