Генерация случайных чисел с помощью цикла
У меня проблемы с этой "игрой со случайными числами".
Я хочу, чтобы случайное число сохраняло его значение только для внутреннего времени выполнения и менялось, когда пользователь решает повторить попытку. Я думал, добавив srand
вне цикла будет менять значение каждый раз, но кажется, что это не так.
//Libraries
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
//Global Constants
//Function Prototypes
int rnd();//random number function
//Execution Begins Here
int main(int argc, char *argv[]){
//Declare Variables
unsigned int seed=time(0);
int n;
char a;
//set the random number seed
srand(seed);
do{
do{
//Prompt user;
cout<<"*** Random Number Guessing Game *** \n"
<<" Guess a number between 1-10, \n"
<<" Enter your number below! \n";
cin>>n;
//process
if(n<rnd()){
cout<<" Too low, try again.\n";
}else if(n>rnd()){
cout<<" Too high, try again.\n";
}else if(n==rnd()){
cout<<rnd()<<" Congradulations you win!.\n";
}
}while(n!=rnd());
cout<<"try again? (y/n)\n";
cin>>a;
}while(a=='y' || a=='Y');
system("PAUSE");
return EXIT_SUCCESS;
}
int rnd(){
static int random=rand()%10+1;
return random;
}
2 ответа
Представьте себе длинную строку "псевдослучайных" чисел. Там указатель на какое-то место в строке и вызов rnd()
распечатывает номер, на который указывает номер, и перемещает указатель на следующий номер. Следующий звонок rnd()
делает то же самое. Если два одинаковых номера не окажутся рядом друг с другом, что может случиться, но маловероятно, вы получите два разных номера для двух разных звонков. Когда вы звоните srand
вы в основном устанавливаете указатель на известную точку на линии, поэтому вызовы rnd()
вернет то, что они сделали раньше.
В картинках:
srand(0)
... 1 9 3 4 9 7 ...
^ (srand puts the pointer to 9.)
a call to rand returns 9 and updates the pointer:
... 1 9 3 4 9 7 ...
^
the next call to rnd() will return 3.
If you call srand(0) again it'll be
... 1 9 3 4 9 7 ...
^
and a call to rnd() will return 9 again.
Если вы хотите сохранить тот же "случайный" номер, позвоните rnd
один раз и сохраняйте значение до тех пор, пока оно вам не понадобится, вместо того, чтобы каждый раз вызывать rnd
Использование srand(time(NULL));
вместо srand(seed);
, Или вы можете изменить
unsigned int seed=time(0);
^ You are seeding same value every time
в
unsigned int seed=time(NULL);