2016-07-06 160 views
0

我最近开始使用C,并且遇到麻烦使计算机想到一个随机数。 这是迄今为止的代码。我需要帮助!C中的随机数生成器游戏

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    time_t t; 
    int userin; 
    printf("Guess a number from 1 to 10\n"); 
    scanf("%d", userin); 
    int r = rand() % 11; 

    if (r == userin) 
    { 
     printf ("you are right"); 
    } 
    else 
    { 
     printf("Try again"); 
    } 
    return 0; 
} 

Thx很多家伙它解决了!

+2

你不调用'srand'函数。在变量声明后包含'time.h'并调用'srand(time(NULL));'。 – Misaz

+2

在阅读时缺少'&':'scanf(“%d”,&userin);'而不是'scanf(“%d”,userin);' –

+0

有趣的是,代码在用户输入后生成随机数。当然,顺序并不那么重要 - 它只是看起来代码是先知道用户输入而作弊。可以简单地编码'puts(“猜测一个数字从1到10”);的scanf( “*%S”); puts(rand()%10 == 0?“你是对的”:“再试一次”);'是否需要比较正确的用户输入?在任何一种情况下,用户都能赢得1/10的时间。 – chux

回答

0

问题:

scanf("%d", userin); //you are sending variable 
  • 这是不对的,因为你需要为参数的variable的发送地址scanf()不是variable

所以不是改变它到:

scanf("%d", &userin); //ypu need to send the address instead 

rand()%11会产生任何数量从010但不能从110

其他答案表明,使用:

(rand()%10)+1 //to produce number from 1 to 10 

解决方案:

而且还包括time.h功能使用srand(time(NULL));

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) 
{ 
    srand(time(NULL)); 

    int userin; 

    printf("Guess a number from 1 to 10\n"); 
    scanf("%d", &userin); 
    int r = (rand() % 10)+1; 

    if (r==userin) 
    { 
     printf ("you are right"); 
    } 
    else 
    { 
     printf("Try again"); 
    } 

    return 0; 
} 

为什么使用srand(time(NULL))

  • rand()不是随机可言,它只是产生哪些是表面上随机和重复自己在一段数字序列的功能。

  • 你可以改变的唯一的事情是种子,它会改变序列中的起始位置。

,并srand(time(NULL))用于这个原因

+0

建议重新措辞“和兰德()%11将产生任何数字从0到10但不是但不是从0到10” – chux

+0

@chux我忽视了它,谢谢! – Cherubim

+0

@everyone thx很多我得到它的工作你的家伙! –

5

在你的代码,r将从0的随机数到10。1和10之间的随机数,这样做:

int r = rand() % 10 + 1; 

此外,你应该叫

srand(time(NULL)); 

main的开始处播种随机数发生器。如果您没有给发生器播种,它总会产生相同的序列。

2

您的scanf声明中也存在问题。

您应该使用,而不是

scanf("%d", &userin); 

scanf("%d", userin); /* wrong - you need to use &userin */ 

scanf需要在哪些它将存储值的变量的地址。对于变量,这由变量优先给出&给出,如&userin

2

有在代码中的几个问题。

  1. 没有读成使用地址的变量&scanf
  2. 不考虑输入的“合法”的价值观,rand()%11结果也可以0
  3. 没有检查,对“非法”的输入值,它可“别名”的结果。
  4. 未正确初始化种子的伪随机rand()函数,所以它总是返回相同的结果。

使用printf调试代码,如下面的例子中,基于您的代码可以帮助很多:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define DEBG 1 

int main (void) 
{ 
    time_t t; 
    int userin; 
    printf("Guess a number from 1 to 10\n"); 
    if(scanf("%d", &userin) != 1){ // read into the variable's address 
     printf("Conversion failure or EOF\n"); 
     return 1; 
    } 

    if(userin < 1 || userin > 10){ // check against "illegal" input 
     printf("Offscale, try again\n"); 
     return 1; 
    } 

    srand(time(NULL));    // initialize the seed value 
    int r = 1 + rand() % 10;  // revise the formula 

    if (DEBG) printf("%d\t%d\t", r, userin); //debug print 

    if (r==userin){ 
     printf ("you are right\n"); 
    }else{ 
     printf("Try again\n"); 
    } 
    return 0; 
} 

请,也咨询this SO post

+0

检查'scanf()'的返回值也是一个好主意。 – chux

+0

感谢您的建议,@chux,真的是一个很好的编程习惯:不应该忽略'scanf()'返回值。 ( - : – user3078414

0

这应该工作

#include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 

    int main() 
    { 
     int userIn = 0; //I like to initialize 
     printf("Guess a number from 1 to 10\n"); 
     scanf("%d", &userIn); 

     srand(time(NULL)); //seed your randum number with # of seconds since the Linux Epoch 

     int r = (rand()%10)+1; //rand%11 gives values 0-10 not 1-10. rand%10 gives 0-9, +1 makes sure it's 1-10 

     if (r == userIn) 
     { 
     printf ("you are right\n"); 
     } 
     else 
     { 
     printf("Try again\n"); 
     } 
     return 0; 
    } 

编辑:您可能要实现代码以验证用户输入实际上是一个整数。