2

任何人都可以在这个程序中提供帮助吗?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
    srand(time(NULL));
    int r = rand();
    int op = 0;
    while(0==0){
        printf("Enter a value\n ");
        scanf("%i\n",&op);

        if (op == r ){
            printf("yes");
            break;  
        }

        else if( op<r)
            printf("Your guess is lower than the number");
        else
            printf("Your guess is higher than the number");
    }
    printf("%i",r);
    return 0;
}    

当我在“终端”中尝试程序时,结果总是:你的猜测低于数字

我不知道发生了什么事?但是当我在 Windows 中使用代码块时,它似乎很完美。

这个问题是来自 Linux 还是编译器

我在终端中写了 cc main.c 然后“./a.out”

4

4 回答 4

2

rand()将返回一个最大为 的数字RAND_MAX。该值取决于平台。

在 Windows 上使用 Visual C++,RAND_MAX等于 32767。但是,在 Linux 上,使用 GNU C 库时,它将等于 2147483647。因此,您将有更大范围的数字可供猜测。这可能就是为什么你总是猜测 Linux 上的数字太小,而 Windows 上的数字太小。

请注意,2147483647 是int带有 gcc 的最大可能值,因此猜测高于该值不会给出正确的结果,因为猜测不适合op.

正如其他人所说,您应该将 的值限制为r与平台无关的值,例如rand() % 100.

于 2012-07-22T15:32:56.470 回答
1

看起来你的价值r可能相当大。我不知道为什么它在 Windows 中效果更好,你试过很多次吗?可能是你很幸运,让它产生的数字比你想象的要少。我只是运行它并放置在打印输出中,值是r = 1262702361,非常大。

要将值保持在 1 和 100 之间,请使用 mod 运算符。类似的东西r = r%100会将 r 限制在 1 - 100 范围内。

于 2012-07-22T15:33:26.690 回答
1

我认为你应该限制 r 可以属于的范围,使用类似的东西:

 r = rand() % 100;//r will be between 0 and 99 
于 2012-07-22T15:34:20.627 回答
0

rand0返回和之间的伪随机整数RAND_MAX,但RAND_MAX可以是一个大数字(在我的 GNU/Linux 上为 2147483647)。您应该执行模运算(%运算符)。

为了确保这一点,您应该r在终端上打印 的值。

于 2012-07-22T15:34:33.947 回答