用循环生成随机数

时间:2014-01-23 16:41:24

标签: c++ loops if-statement random srand

我在使用这个“随机数游戏”时遇到了麻烦 我希望随机数只保留内部do的值,并在用户决定再次尝试时进行更改。 我认为在循环之外添加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 个答案:

答案 0 :(得分:0)

想象一下很长的“伪随机”数字。有一个指向行中某个位置的指针,调用rnd()打印出指向的数字,并将指针移动到下一个数字。下一次调用rnd()会做同样的事情。除非两个相同的数字恰好相邻,这可能发生但不太可能,你会得到两个不同的数字,两个不同的rand调用。当您调用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。

答案 1 :(得分:0)

使用srand(time(NULL));代替srand(seed);。或者你可以改变

unsigned int seed=time(0);  
                       ^ You are seeding same value every time  

unsigned int seed=time(NULL);