簡體   English   中英

每次調用變量時如何生成隨機數?

[英]How can I generate a random number each time a variable is called?

我正在制作一個非常簡單的“數學家教”程序,其中需要顯示帶有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;

    //...
}

現在,每次循環時,數字都會有一個新值。

編輯:答案現在在循環外顯式顯示srand(seed) ,以防萬一您的問題是將該代碼移入循環中。
而且,就像whozcraig所說的那樣,每次只需要使用兩個隨機數,因為您每次只使用生成的兩個數。

只是Baldrick的一個附加答案,當您使用time(0)進行播種,然后僅執行while循環時,沒有任何停止或詢問用戶接下來要做什么(exit / continue),則值將與您播種的值相同時間值(時間值沒有改變,因為while循環快速處理了程序)。也許這不是問題所在,但很高興知道:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM