为猜谜游戏生成随机数生成器

时间:2014-03-28 12:15:43

标签: c++ random

该程序是一个高低猜谜游戏,其中生成随机数,并且用户有6次尝试猜测该数字。我只复制了我的main函数和DrawNum和GetGuess函数的定义,如果被询问/需要会发布更多。我的目标是让DrawNum函数返回随机数,并在GetGuess函数中调用DrawNum函数(如果这是最有效的方法)。该函数构建正常,但是当我运行程序时,我得到运行时检查失败#3 - 变量' MaxNum'正在使用而未被初始化。

int main ()
{
    int money;
    int bet;
    int guesses;
    unsigned int seed = 0;

    srand(static_cast<unsigned>(time(NULL)));   //get a value for the time from the     computer's clock and with
    srand (seed);                               //it calls     srand to initialize "seed" for the rand() function

    PrintHeading ();                            //Prints output heading
    GetBet (money, bet);
    GetGuess ();
    CalcNewMoney (money, bet, guesses);
    bool PlayAgain ();

}
int DrawNum (int max)
{
    double x = RAND_MAX + 1.0;      /* x and y are both auxiliary */
    int y;                          /* variables used to    do the */
                                    /* calculation */

    y = static_cast<int> (1 + rand() * (max / x));
    return (y);                     /* y contains the result */
}

int GetGuess ()
{
    int guess;          //user's guess
    int guesses;    //number of Guesses
    int MaxNum;
    int RandNum;

    RandNum = DrawNum (MaxNum);

    for (int guesses = 1; guesses <= 6; guesses++)
    {
        cout << "Guess " << guesses <<  ":" << endl;
        cin >> guess;
        if (guess > RandNum)
        {
            cout << "Too high... " <<endl;
        }
        else if (guess == RandNum)
        {
            cout << "Correct!" << endl;
        }
        else
        {
            cout << "Too low... " << endl; 
        }
    }
    return (guesses);
}

1 个答案:

答案 0 :(得分:1)

从问题的标题我得到的主要问题是随机生成数字 如果我在这里是我的建议(否则你应该重新提出你的问题,通过提供你需要的其他信息):
您的随机生成器不正确, 由rand()生成的随机数不是均匀分布的,这是众所周知的事实,并且使用% - 导致顺序中的第一个数字是幸运的选择。

所以我建议你使用random_engine generator或random_device

std::default_random_engine generator(time(0));
 std::uniform_real_distribution<double> distribution(first, last);
 return distribution(generator);

缺点:如果打开使用相同随机数生成器的多重程序,它们将输出相同的结果,因为它们具有相同的种子值,即时间。使用随机设备解决了这个问题,请参阅以下说明:

std::uniform_real_distribution<double> distribution(first, last);
 std::random_device rd;
 std::default_random_engine generator( rd() );
 return distribution(generator);