习题描述:
1.C库函数rand()通常返回约15个随机位。使用该函数实现函数bigrand和bigrand和randint(l, u), 要求前者至少返回30个随机位,后者返回[l,u]范围内的一个随机整数。
问题解析:
什么是随机位?
其实这里作者是说rand()函数通常返回的值范围是:[0, RAND_MAX], 而RAND_MAX的值通常为32767(0x7FFF)(15个bit位的最大值), Window下RAND_MAX一般为32767, 而在Linux下这个值有可能是:2147483647(7FFFFFFF)(31个随机位最大值),所以根据操作系统,IDE环境,编译器等具体分析。
我们假设RAND_MAX=32767, 那么返回至少30个随机位,其范围就为:[0, 1073741823]([0, 3FFFFFFF]).解决方案:
作者给出的解决方案:
1
2 3 4 5 6 7 8 9 10 |
int bigrand()
{ return RAND_MAX*rand() + rand(); } int randint( int a, int b ) { return a + bigrand() % (b - a + 1); } |
这里作者给出的bigrand的最大值为:1073709056(3FFF8000),那么就是说其最大值范围就是[0,1073709056],那么就达不到1073741823,会不会有点问题???
我的解决方案:
1
2 3 4 5 6 7 8 9 10 |
int bigrand()
{ return RAND_MAX*rand() + rand() + rand(); } int randint( int a, int b ) { return a + bigrand() % (b - a + 1); } |
特别说明:使用bigrand的时候一定要先明确RAND_MAX的最大值是多少? 如果是2147483647(7FFFFFFF),那么已经能够表示[0, 2^32)的范围了,那么这个时候在使用bigrand的值会出现问题,比如:返回的值会可能会小于0.(因为会发生数值溢出的情况)。
如果有错,敬请留言指正,我会在第一时间修正,与君共进步!!!