【问题标题】:Why is the random number I'm generating not changing within a loop? C为什么我生成的随机数在循环中没有变化? C
【发布时间】:2014-10-28 13:53:01
【问题描述】:

这是我当前的代码。我正在尝试创建一个游戏,让计算机生成一个随机数,用户必须猜测它是高于还是低于显示的数字。但是我无法让随机数更改它始终保持不变。

那么我怎样才能改变随机数,以便用户可以继续猜测而不是陷入以下循环: 高于还是低于 6? 0 高于还是低于 6? 0

#include <stdio.h>

int main ()

{
  int rdmnum;
  int rdm2;
  int guess;
  int x = 1;

  srand (time(NULL));
  rdmnum = rand () % 9;


  printf("To guess higher enter 1, to guess lower enter 0.\n");


printf("Higher or lower than %d?\n", rdmnum);
scanf("%d", &guess);
do {
  if (guess == 1 && guess >= rdmnum){
    printf("Higher or lower than %d?\n", rdmnum);        
    scanf("%d", &guess);
    x = 1;
  }
  else {
     x = 0;
  }

  if (guess == 0 && guess <= rdmnum){
    printf("Higher or lower than %d?\n", rdmnum);
    scanf("%d", &guess);
    x = 1;
  }
  else {
    x = 0;
  }
  } while (x ==1);

  if (x ==0) {
    printf("Incorrect the number was %d, game over!\n", rdmnum);
  return 0;
  }

}

【问题讨论】:

  • 您是否期望rdmnum 在循环中神奇地获得随机数?你在循环之前只调用了一次rand。
  • 我是否正确理解 0 总是意味着猜测“较低”?因为您似乎将猜测(1 或 0)与此随机数进行比较
  • 是的,这是正确的。 1 表示较高,0 表示较低。

标签: c random numbers


【解决方案1】:

回答为什么rdmnum 没有改变:

试试这个:

//code
do {
  rdmnum = rand () % 9;               //Take note of this line!
  if (guess == 1 && guess >= rdmnum){
    printf("Higher or lower than %d?\n", rdmnum);  
//rest of code

您只在循环外运行了一次rand() 函数。因此,您只计算了一次随机数,并且每次都使用它。

通过将其移动到循环中,每次循环迭代时,都会生成一个新的随机数。

编辑:

根据您的评论,您的算法存在更大的问题。

从你声明的两个随机数和我掩盖的问题中的一些额外点来看,你的问题不仅仅是rdmnum 没有改变。

你的ifs 也需要工作;您的第二个 if 会覆盖第一个的结果。

你可以试试:

if (guess == 1 && guess >= rdmnum)
{
    printf("Higher or lower than %d?\n", rdmnum);        
    scanf("%d", &guess);
    x = 1;
}
else if (guess == 0 && guess <= rdmnum)
{
    printf("Higher or lower than %d?\n", rdmnum);
    scanf("%d", &guess);
    x = 1;
}
else 
{
    x = 0;
}

这样,如果玩家猜到 1(并且猜对了),那么第二个 if 不会每次都将 x 设置为 0。 此外,您正在测试 0-9 范围内的数字与 0-1 范围内的数字。这非常通常会导致输入 0 正确,但 1 很少正确 - 仅当您的问题输出为:

Higher or lower than 0?

我冒昧地用更简单的逻辑重写了您的程序。我还添加了第二个随机数的使用,以便您猜测random number #1是否大于或小于random number #2

int main ()
{
    int target;
    int displayed;
    int guess;
    int difference;

    srand (time(NULL));
    printf("To guess higher enter 1, to guess lower enter 0.\n");

    while(true)
    {
        //we randomise both the displayed number and the hidden number to compare it to
        //and ensure that they are not equal
        do
        {
            target = rand () % 9;
            displayed = rand () % 9;
        } while (displayed == target)

        //ask the question:
        printf("Higher or lower than %d?\n", displayed);
        scanf("%d", &guess);
        if (guess == 0 || guess == 1)
        {

            //now see if they were correct
            difference = (target - displayed) > 0;
            if (guess == difference)
            {
                //they were right
                printf("Correct the number was %d!\n", target);
            }
            else
            {   //they were wrong - exit the loop
                printf("Incorrect the number was %d, game over!\n", target);
                break;
            }
        }
        //bad input - just loop
        printf("Incorrect input!\n");
    }
    return 0;
}

另外,仅供参考,随机通常缩写为: rnd not rdm。 不是什么大事,但在别人阅读你的代码时会有所帮助

【讨论】:

  • 我在代码中实现了这一点。如果您猜为 0,它会成功运行,但是如果您猜得更高,它会立即返回一个不正确的数字。知道为什么吗?
  • 我现在可以看到其中的错误。我没有考虑与答案始终为 1/0 的事实相关的 条件。我稍微修改了你的代码,因为它显示了编译错误。 ' { 目标 = 兰德 () % 9;显示 = 兰德 () % 9; } 而(显示 == 目标);'所以现在如果显示和目标相同,它将重新创建一个新的随机数。
  • 啊,是的,打错字了,抱歉。固定的。如果我提供了帮助,请随时点赞/接受。
  • 还有一个问题,我不明白这个位是如何工作的。差异 =(目标 - 显示)> 0; if (guess == difference) , 如果目标是 4 但显示的是 8 那么 (4 - 8) > 0;没有意义。如果目标是 8 但显示的是 4 则 (8 - 4) > 0;表示差异为 4,但唯一的输入是 1 或 0,那么它怎么可能是正确的?
  • difference = (target - displayed) &gt; 0 找出两个随机值之间的差异 (target - displayed),然后将其与 0 进行比较。如果target 大于displayed,则结果为1,否则为0(&gt; 返回布尔值-1(true) 或0(false))。然后可以直接将其与玩家的输入进行比较。 if (guess == difference) 如果正确则为真。
【解决方案2】:

我认为您希望拥有随机数,而不仅仅是一个随机数。所以添加

rdmnum = rand () % 9;

就在do{ 之后,以便在每次迭代中生成一个随机数。另请注意,您需要在程序中包含stdlib.h。

P.S:你的代码中使用的逻辑对我来说对猜谜游戏没有任何意义......

【讨论】:

  • 您能否为我详细解释一下逻辑问题?
  • @hysteriaistic ,请使用预期输出编辑您的问题。如果您在回答当前问题时提出一个新问题会更好。
  • @hysteriaistic 我在更新的答案中触及了逻辑
  • @hysteriaistic,你还需要#include &lt;time.h&gt;。你真的编译并运行了你发布的程序吗?
  • 我的编译器给出“警告 C4013:'time' 未定义;假设 extern 返回 int”,尽管它已链接并运行,但仍不能令人满意。最好完全没有警告,所以另外随机化应该是srand ((unsigned int)time(NULL));
猜你喜欢
  • 2016-08-07
  • 2022-01-04
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多