[英]How to make a member function of a class in C++ generate a different random number each time it is called?
[英]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.