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

查看:112
本文介绍了c - 分析代码如何使前15位随机的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

答案如下

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

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

解决方案

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

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

这篇关于c - 分析代码如何使前15位随机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆