c++ - 每次调用变量时如何生成随机数?

标签 c++

我正在制作一个非常简单的“数学导师”程序,我需要在其中显示一个包含 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;
        }
    }
}

最佳答案

简单:

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

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;

    //...
}

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

编辑:Answer 现在在循环外显式显示 srand(seed),以防您的问题是将该代码移入循环。
另外,喜欢 whozcraig说过,您每次只需要两个随机数,因为您每次只使用生成的数字中的两个。

关于c++ - 每次调用变量时如何生成随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26232307/

相关文章:

在 C++ 中具有多个枚举参数的 C++ 函数模板部分特化?

c++ - 一个类的内存布局是连续的吗?

c++ - 使用指针将 uint16_t 值注入(inject) uint8_t 数组?

c++ - 为什么这里要调用拷贝构造函数呢?

C++ - % 运算符的 GMP 库错误

c++ - 映射最大有效插入

c++ - WebRTC 的 undefined reference

c++ - 类中定义的友元函数模板是否可供查找? clang++ 和 g++ 不同意

c++ - Boost.Asio、tcp::iostream 和多线程

c++ - std::vector 使用成员变量排序