Моя программа иногда выводит выходные данные, хотя они правильно скомпилированы?

#c

Вопрос:

Моя программа здесь состоит в том, чтобы случайным образом назначить переменные (number1, number2, number3, number4) числу, хранящемуся в vector <int> number . Я хочу убедиться, что каждое число будет отображаться только 1 раз. Вот мой код :

 #include <iostream>
#include <vector>
#include <random>
#include <ctime>
using namespace std;

int main()
{
    srand(time(NULL));
    vector<int> number = { 5, 6, 7, 8 };
    int number1, number2, number3, number4;

    do {
        number1 = number[rand() % 4];
        number2 = number[rand() % 4];
        number3 = number[rand() % 4];
        number4 = number[rand() % 4];
        if (number2 != number1) {
            if (number3 != number1 amp;amp; number3 != number2) {
                if (number4 != number1 amp;amp; number4 != number2 amp;amp; number4 != number3) {
                    cout << number1 << number2 << number3 << number4;
                }
            }
        }
    } while ((number1   number2   number3   number4) != 26);
}
 

Иногда он выводит правильные выходные данные на терминал, но иногда он просто ничего не печатает, и программа завершается. Я не знаю, почему это происходит, может ли кто-нибудь предложить мне решение ?

Комментарии:

1. когда сумма равна 26, программа заканчивается, и она печатает что-то только тогда, когда выполняется какое-то другое условие

2. почему вы думаете, что код всегда должен что-то печатать ?

3. Сумма может быть 26 без выполнения всех 3 ваших условий if (). Я добавил тот же cout после кода, и при первом запуске он напечатал 6686 : https://ideone.com/xtkSH7

4. В 6 6 8 6 не будет напечатано, но равно 26. Вы хотели убедиться, что каждое число отображается только 1 раз. Если это так, то std::shuffle() может быть тем, что вы хотите, а не тем, что вы делаете: https://en.cppreference.com/w/cpp/algorithm/random_shuffle смотрите пример внизу для рабочей программы.

5. Как только вы нарисовали число, вы можете стереть его из вектора. И так далее, пока не останется только 1 число. Не очень эффективно, но легко понять, и не потребуется никакого do цикла или сложного условия. Способ «pro» заключается в использовании std::shuffle , как упоминал @drescherjm, но уровень «pro» может быть слишком высоким для вас. Пишите только тот код, который вы понимаете.

Ответ №1:

Я хочу убедиться, что каждое число появится только 1 раз

Вместо того, чтобы выбирать индекс, вы можете shuffle выбрать его.

 #include <iostream>
#include <vector>
#include <random>

int main() {
    std::vector<int> number = { 5, 6, 7, 8 };
    std::shuffle(number.begin(), number.end(), std::random_device{});
    std::cout << number[0] << " " << number[1] << " " << number[2] << " " << number[3] << std::endl;
}