重造轮子-random5到random7

来源:互联网 发布:java中求最大公约数 编辑:程序博客网 时间:2024/06/04 18:50

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

0 0