【问题标题】:How can I generate a random number each time a variable is called?每次调用变量时如何生成随机数?
【发布时间】:2014-10-07 08:59:51
【问题描述】:

我正在制作一个非常简单的“数学导师”程序,我需要在其中显示一个包含 4 个选项的菜单:加法、减法、乘法和退出。程序应该循环,直到我选择退出。

到目前为止,一切似乎都在工作,但我无法弄清楚每次程序循环时如何生成一个新的随机数。

代码如下:

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int addFirstNum,
    addSecondNum,
    subFirstNum,
    subSecondNum,
    multFirstNum,
    multSecondNum,
    operNum,
    num;
    bool temBool = true; //Temporary boolean used in the while loop
    unsigned seed; // Random generator seed

    // Use the time function to get a "seed" value for srand
    seed = time(0);
    srand(seed);

    //Random generated operands
    addFirstNum = rand() % 40 + 10;
    addSecondNum = rand() % 40 + 10;
    subFirstNum = rand() % 40 + 10;
    subSecondNum = rand() % 40 + 10;
    multFirstNum = rand() % 40 + 10;
    multSecondNum = rand() % 40 + 10;


    while (temBool) //Start of the loop
    {
        // Menu of Math Tutor
        cout << "Math Tutor - Main Menu";
        cout << endl << endl;
        cout << "1. Adittion\n";
        cout << "2. Subtraction\n";
        cout << "3. Multiplication\n";
        cout << "4. Exit Program\n";
        cout << endl << endl;
        cout << "Choose your operation to practice (1-4) ";
        cin >> operNum;
        cout << endl << endl;

        // Switch for the menu's options
        switch (operNum)
        {
            case 1:
                cout << "Working with addition\n";
                cout << setw(3) << addFirstNum << "\n"
                << "+" << addSecondNum << "\n"
                << "---\n";
                cout << "Your answer: ";
                cin  >> num;
                if(num == addFirstNum + addSecondNum)
                {
                    cout << "Correct answer: "
                    << addFirstNum + addSecondNum << " Congratulations!\n";
                }
                else
                {
                    cout << "Correct answer: "
                    << addFirstNum + addSecondNum << " Sorry!\n";
                }
                cout << endl << endl;
                break;
            case 2:
                cout << "Working with subtraction\n";
                cout << setw(3) << subSecondNum << "\n"
                << "-" << multFirstNum << "\n"
                << "---\n";
                cout << "Your answer: ";
                cin  >> num;
                if(num == subSecondNum - multFirstNum)
                {
                    cout << "Correct answer: "
                    << subSecondNum - multFirstNum << " Congratulations!\n";
                }
                else
                {
                    cout << "Correct answer: "
                    << subSecondNum + multFirstNum << " Sorry!\n";
                }
                cout << endl << endl;
                break;
            case 3:
                cout << "Working with multiplication\n";
                cout << setw(3) << multFirstNum << "\n"
                << "*" << multSecondNum << "\n"
                << "---\n";
                cout << "Your answer: ";
                cin  >> num;
                if(num == multFirstNum * multSecondNum)
                {
                    cout << "Correct answer: "
                    << multFirstNum * multSecondNum << " Congratulations!\n";
                }
                else
                {
                    cout << "Correct answer: "
                    << multFirstNum + multSecondNum << " Sorry!\n";
                }
                cout << endl << endl;
                break;
            case 4:
                cout << "Thank you for using Math Tutor.\n";
                temBool =  false;

                break;
            default:  cout << "Incorrect menu seletion. Please choose between 1 and 4.\n"; 
                return 0;
        }
    }
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    简单:

    在循环内移动随机值生成器行:

    seed = time(0);
    srand(seed);    //setting the seed should only be done outside the loop (as per original code)
    
    while (temBool) //Start of the loop
    {
    
        //Random generated operands
        addFirstNum = rand() % 40 + 10;
        addSecondNum = rand() % 40 + 10;
        subFirstNum = rand() % 40 + 10;
        subSecondNum = rand() % 40 + 10;
        multFirstNum = rand() % 40 + 10;
        multSecondNum = rand() % 40 + 10;
    
        //...
    }
    

    现在每次循环时,数字都会有一个新值。

    编辑:答案现在在循环外显式显示srand(seed),以防您的问题是将代码移入循环。
    另外,就像whozcraig 所说的那样,您每次只需要两个随机数,因为您每次只使用您生成的两个数字。

    【讨论】:

    • 感谢您的快速回复!这似乎很明显,但我尝试以这种方式编译它,但我仍然没有得到新的数字。
    • 我把你的代码开头,把随机数生成放到循环中,让它循环5次。看看:ideone.com/KEW6cf
    • 谢谢你,看起来它会起作用,但我仍然在将它合并到我的代码中时遇到问题,以便它每次都会给我新的数字。例如,我选择 1(加法)并在收到祝贺信息后立即执行此操作,我再次获得菜单,如果我再次选择 1,我将获得相同的数字,而不是一组新的随机数。我知道我在这里遗漏了一些小东西,但我看不到它。谢谢
    • @RufioLJ 理想情况下应该是something like this。 (我删除了猖獗的重复数字;你只需要每次迭代两个)。
    • @RufioLJ 你没有碰巧也在循环内移动srand(seed);?这样每次都会给出相同的“随机”序列。
    【解决方案2】:

    只是对 Baldrick 的一个附加答案,当您使用 time(0) 播种然后只执行一个 while 循环时,没有任何停止或询问用户下一步要做什么(退出/继续),值将与您播种的值相同具有相同的时间值(时间值没有改变,因为while循环快速处理程序)。也许这不是问题,但很高兴知道:)

    【讨论】:

    • 这似乎是一个问题,因为我在循环时没有得到新的值。只有当我再次运行程序时。感谢您的帮助。
    • 这个答案加上 Baldrickk 正在引导我找到解决方案。这些信息实际上是我需要处理的。
    • 只要种子不在循环中,rand() 的输出就会不同。 seed = time(0); srand(seed); 的行应该保留在循环之外。编辑我的答案以使其更加明确。
    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2020-10-12
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多