Генерация случайных чисел с помощью цикла

У меня проблемы с этой "игрой со случайными числами".
Я хочу, чтобы случайное число сохраняло его значение только для внутреннего времени выполнения и менялось, когда пользователь решает повторить попытку. Я думал, добавив 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);
Другие вопросы по тегам