2015-10-13 3 views
1

Мне нужно два случайных числа в каждом цикле, но они не могут использовать случайные числа предыдущего цикла. Я потерян, я искал и не знаю, что делать. Пожалуйста помоги! Я поставил свой код ниже. Итак, мне нужно, в частности, генерировать два случайных числа, хранящихся в n1 & n2. Затем, в следующем цикле, не используйте эти предыдущие числа. Тем не менее, их можно использовать после того, как они не использовались дважды подряд.loop rand(), на следующем rand() не использовать предыдущий?

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

int main() 
{ 
    //declare variables 
    int numAttempts = 3; 
    int response; 
    char playAgain; 
    int points; 
    bool previousAnswer; 
    srand(time(0)); 

    //Welcome user to the program and explain the rules 
    cout << "\nWelcome! This is the Multiplication Practice Game!" << endl 
    << "A multiplication problem will be presented which you must solve." << endl << endl 
    << "THESE ARE THE RULES:" << endl 
    << "*You start with 3 lives." << endl 
    << "*Each correct answer earns you 5 points!" << endl 
    << "*An incorrect answer results in 1 life lost." << endl 
    << "*If you're incorrect but within 5 of the answer:" << endl 
    << "\t-you are granted another attempt" << endl 
    << "\t-you earn 3 points if correct" << endl 
    << "\t-you lose a life if incorrect" << endl 
    << "*Once you lose all of your lives, it's game over!" << endl << endl 
    << "Good luck, let's begin..." << endl << endl; 

    //Do while numAttempts is not equal to 0 
    do{ 
      //Random numbers for n1 and n2 
      int n1 = rand() % 13; 
      int n2 = rand() % 13; 

      //Present the problem and prompt for response 
      cout << "Answer the problem: "; 
      cout << n1 << "*"<< n2 << ": "; 
      cin >> response; 

      //If response is correct, congratulate 
      if(response == n1*n2) 
      { 
       cout << "CORRECT, great job. Keep going! \n\n"; 
       points += 5; 
       previousAnswer = true; 
      } 

      //If response is not correct and lives are not equal to 0 
      if((response != (n1*n2)) && (numAttempts != 0)) 
      { 
       //If response is not within 5 of the correct answer, no second chance and subtract 1 from numAttempts 
       if((response > (n1*n2)+5) || (response < (n1*n2)-5) || (previousAnswer != true)) 
       { 
        cout << "That answer is incorrect." << endl; 
        numAttempts -= 1; 
        previousAnswer = false; 
        cout << "You have " << numAttempts << " lives remaining" << endl << endl; 
       } 

       //If response is within 5 of correct answer and previousAnswer is true, offer second attempt 
       if(response <= ((n1*n2)+5) && (response >= (n1*n2)-5) && (previousAnswer == true)) 
       { 
        cout << "So close, try once more: "; 
        cin >> response; 
        if(response == n1 * n2) 
        { 
         cout << "CORRECT, great job. Keep going! \n\n"; 
         points +=3; 
         previousAnswer = true; 
        } 

        //If answer is still incorrect, subtract 1 from numAttempts 
        else{ 
        cout << "Sorry, that answer is still incorrect" << endl; 
        numAttempts -= 1; 
        previousAnswer = false; 
        cout << "You have " << numAttempts << " lives remaining" << endl << endl; 
        } 
       } 
      } 


      //If user runs out of lives, notify and ask if they would like to play again 
      if (0 == numAttempts) 
      { 
       cout << "You're all out of lives!" << endl 
       << "Your total score is " << points << ", great job!" << endl 
       << "Would you like to play again? Y/N: "; 
       cin >> playAgain; 
       if('y' == tolower(playAgain)) 
       { 
        cout << "\nGreat! Let's try again! Good luck!" << endl; 
        numAttempts += 3; 
        cout << "Let's begin..." << endl << endl; 
       }else{ 
       cout << "\nThanks for playing, see you next time!" << endl; 
       } 
      } 
     }while(numAttempts != 0); //ends loop if attempts are equal to 0 


    return 0; 
} 
+0

Сохраните случайные значения предыдущей итерации в отдельных переменных (определенных вне цикла do) и сравните их с новыми. Если они используют то же самое, что и «продолжить», чтобы снова зациклиться и выбрать два новых. –

+0

Спасибо! Я просто сделал заявление if в моем цикле, которое продолжится, если условия будут выполнены. Потрясающие. – Quadruckus

+0

Чтобы указать, что ваша проблема решена, примите ответ. –

ответ

1

Простой способ выполнить произвольный выбор без повторения - сохранить список чисел в произвольном порядке, по одной записи для каждого номера в вашем диапазоне. Затем вы просто берете тот, который находится впереди списка, используйте его и переместите его в более позднюю позицию.

В вашем случае вы должны перенести его, по крайней мере, в сторону от передней части (после его удаления), чтобы следующий номер спереди не был таким же, как старый фронт.

Пример:

первоначальный список:

6, 5, 10, 1, 0, 11, 8, 12, 4, 2, 3, 7, 9

Возьмите первый номер и удалить из списка.

список теперь:

5, 10, 1, 0, 11, 8, 12, 4, 2, 3, 7, 9

Вставьте число в случайном положении, которое не является фронт.

список теперь:

5, 10, 1, 6, 0, 11, 8, 12, 4, 2, 3, 7, 9

+0

Спасибо за ввод. Я закончил тем, что просто создал оператор if в цикле, который будет продолжаться, если предыдущие вары были одинаковыми. – Quadruckus

+0

О, ладно, gotcha. Я новенький. – Quadruckus

0

Вы можете использовать randomize(); перед вашим rand()%13 тогда программа будет генерировать каждый раз случайные числа и не будет повторяться.