首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么rand() + rand()会产生负数?

为什么rand() + rand()会产生负数?
EN

Stack Overflow用户
提问于 2015-06-14 01:15:39
回答 5查看 45.3K关注 0票数 307

我观察到当rand()库函数在循环中被调用一次时,它几乎总是产生正数。

代码语言:javascript
复制
for (i = 0; i < 100; i++) {
    printf("%d\n", rand());
}

但是当我添加两个rand()调用时,生成的数字现在有更多的负数。

代码语言:javascript
复制
for (i = 0; i < 100; i++) {
    printf("%d = %d\n", rand(), (rand() + rand()));
}

有人能解释一下为什么我在第二个案例中看到负数吗?

PS:我在循环前将种子初始化为srand(time(NULL))

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-06-14 01:18:10

rand()被定义为返回一个介于0RAND_MAX之间的整数。

代码语言:javascript
复制
rand() + rand()

可能会溢出。您观察到的结果很可能是整数溢出导致的undefined behaviour的结果。

票数 545
EN

Stack Overflow用户

发布于 2015-06-18 17:15:55

基本上,rand()0RAND_MAX之间产生数字,在您的例子中是2 RAND_MAX > INT_MAX

你可以用你的数据类型的最大值取模以防止溢出。这当然会扰乱随机数的分布,但rand只是一种快速获得随机数的方法。

代码语言:javascript
复制
#include <stdio.h>
#include <limits.h>

int main(void)
{
    int i=0;

    for (i=0; i<100; i++)
        printf(" %d : %d \n", rand(), ((rand() % (INT_MAX/2))+(rand() % (INT_MAX/2))));

    for (i=0; i<100; i++)
        printf(" %d : %ld \n", rand(), ((rand() % (LONG_MAX/2))+(rand() % (LONG_MAX/2))));

    return 0;
}
票数 3
EN

Stack Overflow用户

发布于 2015-06-16 15:50:20

也许您可以尝试一种相当棘手的方法,即确保2 rand()的和返回的值永远不会超过RAND_MAX的值。一种可能的方法是sum = rand()/2 + rand()/2;这将确保对于RAND_MAX值为32767的16位编译器,即使两个rand恰好都返回32767,即使那时(32767/2 = 16383) 16383+16383 = 32766,也不会产生负和。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30821406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档