c ++ srand(time(0))在猜游戏中不起作用

时间:2019-09-24 02:01:25

标签: c++

我需要用C ++进行猜谜游戏,并且一切正常,除了srand(time(0))在用户要再次玩后不会重置数字。我也不能使用std库。

到目前为止,我没有做过任何事情。我在做while循环错误吗?

#include <iostream>
#include <ctime>
using namespace std;

int main()
{
  //Initialize variables
  int input = 0;
  int playing = 1;
  char yninput[2];
  int count = 1;
  //While the player is playing the game
  while (playing == 1) {
    srand(time(0));
    int num = rand() % 101;
    //While the player hasn't guessed the number
    while (input != num) {
     //Prompt the player
       cout << "Enter your guess" << endl;
      cout << num << endl;
      cin >> input;
      //If the guess is greater than the number
      if (input > num) {
    cout << " Your guess is too high!" << endl;
   count++;
      } 
      //If the guess is less than the number
      else if (input < num) {
    cout << " Your guess is too low!" << endl;
    count++;
      }
      //If the player guesses the correct number
      else {
    cout << " You have guessed the number! It took you " << count << " 
guess(es)! Would you like to play again?" << endl;
    //Ask the play if they want to play again
    cin >> yninput[2];
    //If the player doesn't want to play again quit the program
    if (yninput[2] == 'n') {
      playing = 0;
      input = num;
        }
    //If the player wants to play again restart the program and 
     randomize the number
    else if (yninput[2] == 'y') {
       input = 0;
      count = 1;
         }
      }
    }
  }
}

3 个答案:

答案 0 :(得分:2)

正如@ user4581301所指出的,您不应多次调用srand(time(0)),因为它将根据当前系统时间重置随机种子。如果srand(time(0))被快速连续调用,那么它将作为种子的非常大的数字(我相信是当前的epoch time)将非常接近先前的调用,因此您可能不会注意到RNG的差异。

只需将srand(time(0));行移出while循环即可解决问题。

答案 1 :(得分:0)

  

如何获取它,以便当用户按下“ y”并且游戏重置时,随机数也会改变?

通过调用rand而不在两者之间调用srand,可以得到伪随机序列中的下一个数字。如果您将随机序列设置为从每次迭代的当前时间戳开始,那么您将获得相同的数字,该数字每秒更改一次。

  

我也不能使用std库。

时间,时间,cout和cin都来自标准库。

答案 2 :(得分:0)

我认为 @Mathis 已经指出了解决方案。

我只是分享一些有关srandrand之间的联系的见解。考虑下面的代码片段:

#include <iostream>
#include <ctime>
int main()
{
    int i = 0;
    // Uncomment below line to generate new set of random numbers
    // on every execution.
    // srand(time(0));   
    while (i < 5)
    {
        std::cout<< rand() % 10 <<std::endl;
    }
}

比方说,该程序在第一次运行时生成数字-5、7、3、0和4。如果再次运行该程序,则会看到相同的数字集,即5、7、3、0和4。因此,尽管它们是随机的(准确地说是伪随机),但是在每次执行程序时,顺序的数字将相同。

这就是我们使用srand指定一些种子值的原因。 种子是每次执行都不同的任何值。当我们使用time(0)作为srand的参数时,我们确保在每次程序执行时,我们都提供了一个新的唯一种子。这将确保我们得到真正随机的数字集。