消息关闭
    暂无新消息!

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

问题作者 : djm飘2017-07-31发布

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

答案如下

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

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


2个回答

︿ 2

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

︿ 1

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

#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咯。