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

发布于 2022-09-05 07:57:11 字数 290 浏览 23 评论 0

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

答案如下

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

农村范ル 2022-09-12 07:57:13

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

人事已非 2022-09-12 07:57:12

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文