C中的随机数生成器游戏

时间:2016-07-06 18:43:45

标签: 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;
}

很多人解决了!!!!

5 个答案:

答案 0 :(得分:5)

在您的代码中,r将是0到10之间的随机数。对于1到10之间的随机数,请执行以下操作:

int r = rand() % 10 + 1;

另外,你应该打电话给

srand(time(NULL)); 

main的开头,为随机数生成器播种。如果你没有为发生器播种,它总是生成相同的序列。

答案 1 :(得分:2)

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

你应该使用

scanf("%d", &userin); 

而不是

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

scanf需要存储值的变量地址。对于变量,这是通过使用&来预先变量来给出的,如&userin中所示。

答案 2 :(得分:2)

您的代码中存在一些问题。

  1. 未使用&
  2. 读取变量的地址scanf
  3. 不考虑&#34;合法&#34;输入值,rand()%11的结果也可以是0
  4. 不检查&#34;非法&#34;输入值,可以&#34;别名&#34;结果。
  5. 未正确初始化伪随机rand()函数的种子,因此它始终返回相同的结果。
  6. 使用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

答案 3 :(得分: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))就是出于这个原因而使用

答案 4 :(得分: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;
   }

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