分析代码如何使前15位随机

c库函数rand()通常返回15个随机位,使用此函数实现bigrand()返回至少30个随机位。 —— 节选自《编程珠玑》12.1

答案如下

int bigrand()
{
   return RAND_MAX * rand() + rand();
}

+ rand() 是让后15位随机,但为什么RAND_MAX * rand() rand()与最大值相乘可以让前15位是随机的?

阅读 3.3k
2 个回答

其实这个问题按移位来想就很简单啦。。。
拿个栗子来说吧

#include<iostream>
using namespace std;
void print_binary(int number)
{
    if (number) {
        print_binary(number >> 1);
        putc((number & 1) ? '1' : '0', stdout);
    }
}
int main(void){
    int a=18094;
    int b=18394;
    print_binary(a);
    cout<<endl;
    print_binary(b);
    cout<<endl;
    a=a<<15;
    print_binary(a);
    cout<<endl;
    int c=a+b;
    print_binary(c);
    cout<<endl;
}

output

100011010101110
100011111011010
100011010101110000000000000000
100011010101110100011111011010

首先是a的二进制输出,然后是b的二进制输出,然后我让a向左移15位,这样它就空出了15个低位,然后我让b直接加过去,这样就产生了一个30位的随机数啦,当然我们知道,<<一次相当于*2,所以那个RAND_MAX就是2^15咯。

这就跟占位一样的,比如有两个8位的数,要组成16位的,怎么组合,一个放在高位,一个放在地位。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题