编程珠玑之第12章习题1: 随机位问题

习题描述:

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(),则其最大值刚好达到1073741823(3FFFFFFF),这样就可以了。

特别说明:使用bigrand的时候一定要先明确RAND_MAX的最大值是多少? 如果是2147483647(7FFFFFFF),那么已经能够表示[0, 2^32)的范围了,那么这个时候在使用bigrand的值会出现问题,比如:返回的值会可能会小于0.(因为会发生数值溢出的情况)。

如果有错,敬请留言指正,我会在第一时间修正,与君共进步!!!微笑














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值