C++ 如何在每次调用变量时生成一个随机数?

C++ 如何在每次调用变量时生成一个随机数?,c++,C++,我正在制作一个非常简单的“数学导师”程序,我需要显示一个包含4个选项的菜单:加法、减法、乘法和退出。程序应该循环,直到我选择退出 到目前为止,一切似乎都在运行,但我不知道如何在每次程序循环时生成一个新的随机数 代码如下: #include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> using namespace std; int main() { i

我正在制作一个非常简单的“数学导师”程序,我需要显示一个包含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;
        }
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
int addFirstNum,
addSecondNum,
亚第一,
亚秒,
multFirstNum,
multSecondNum,
operNum,
号码;
bool temBool=true;//在while循环中使用临时布尔值
无符号种子;//随机生成器种子
//使用时间函数获取srand的“种子”值
种子=时间(0);
srand(种子);
//随机生成的操作数
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)//循环的开始
{
//数学家教菜单
cout简单:

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

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)
显式位于循环之外,以防您的问题是将代码移动到循环中。
此外,正如前面所说,每次只需要两个随机数,因为每次只使用生成的两个数。

简单:

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

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)
显式位于循环之外,以防您的问题是将代码移动到循环中。


同样,正如前面所说的,每次只需要两个随机数,因为每次只使用生成的两个数字。

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

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

感谢您的快速响应!这似乎很明显,但我尝试用这种方式编译它,但仍然没有得到新的数字。我从您的代码开始,将随机数生成放入循环中,并使其循环5次。检查:谢谢,看起来它会起作用k、 但我仍然在将它合并到代码中时遇到问题,这样每次它都会给我新的数字。例如,我选择1(加法)我会在收到祝贺信息后马上做这件事,我再次看到菜单,如果我再次选择1,我会得到相同的数字,而不是一组新的随机数字。我知道我遗漏了一些小东西,但我看不到。谢谢you@RufioLJ它应该看起来很理想。(我删除了大量重复的数字;每个迭代只需要两个)@RufioLJ您没有碰巧在循环中移动
srand(seed);
?这会产生相同的“随机”每次排序。感谢您的快速响应!这似乎很明显,但我尝试以这种方式编译它,但仍然没有得到新的数字。我从您的代码开始,将随机数生成放入循环中,并使其循环5次。请查看:谢谢,看起来它会起作用,但我仍然有问题将它添加到我的代码中,这样每次它都会给我新的数字。例如,我选择1(加法)我会在收到祝贺信息后马上做这件事,我再次看到菜单,如果我再次选择1,我会得到相同的数字,而不是一组新的随机数字。我知道我遗漏了一些小东西,但我看不到。谢谢you@RufioLJ它应该看起来很理想。(我删除了大量重复的数字;每个迭代只需要两个)@RufioLJ您没有碰巧在循环中移动
srand(seed);
?这会产生相同的“随机”每次排序。这似乎是一个问题,因为循环时我没有得到新的值。只有当我再次运行程序时。谢谢你的帮助。这个答案加上Baldrickk's正在引导我进入解决方案。这个信息实际上是我需要处理的。只要种子不在循环中,那么来自
rand()的输出
将不同。行
seed=time(0);srand(seed);
应该保持在循环之外。编辑我的答案以使其更明确。这似乎是一个问题,因为我在循环时没有得到新的值。只有当我再次运行程序时。感谢您的帮助。这个答案加上Baldrickk的答案正在引导我进入解决方案。这些信息实际上是我需要处理的。只要ed不在循环中,则来自
rand()
的输出将不同。行
seed=time(0);srand(seed);
应保持在循环之外。编辑我的答案以使其更明确。