我需要用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;
}
}
}
}
}
答案 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 已经指出了解决方案。
我只是分享一些有关srand
和rand
之间的联系的见解。考虑下面的代码片段:
#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
的参数时,我们确保在每次程序执行时,我们都提供了一个新的唯一种子。这将确保我们得到真正随机的数字集。