Top.Mail.Ru
Ответы

Проверка случайно сгенерированных значений внутри цикла на повторяемость C++.

У меня сложилась такая ситуация. Изучал я месяц назад массивы в С++, читал литературу, смотрел видео по теме. И столкнулся со структурой, указанной на картинке. Суть в том, что в программе присутствует рандомная генерация значений для элементов массива. Также при написании было условие - сгенерированные значения не должны повторяться. Для этого автор использовал проверку внутри цикла for с помощью вложенного цикла и конструкции if. И вот на этом моменте, начиная с вложенного цикла for, я перестал понимать логику программы. Зачем автор создал переменную типа bool, зачем он инвертирует её значение, что делает первая конструкция if и что делает вторая. И вот вроде я понимаю смысл такой записи - проверить значение переменной j и сравнить его со значением переменной i, и если они совпадают, то переменная i должна принять в себя другое значение. Но почему это именно так работает, я понять не смог, сидел в отладчике, пытался разобрать эту структуру по кусочкам, всё равно не доходил. Думал, что может писать вообще не моё, но потом решил просто пропустить этот вопрос и вернуться к нему, когда будет побольше знаний и опыта. Ну вот, вернулся я вчера значит и пытался опять разобраться, что тут да как. И вроде я в целом понимаю, зачем тут if и зачем тут i и j, но я всё равно в упор не понимаю логику этого куска кода, хоть лоб расшиби, не могу собрать целостную картину. Поэтому решил задать вопрос более опытным людям.

Вопрос следующий - как работает программа начиная с вложенного цикла for и до последней конструкции if, зачем значение bool переменной инвертируется, зачем она вообще здесь? Заранее извиняюсь, если что-то некорректно сформулировал.

По дате
По Рейтингу
Аватар пользователя
Новичок

#include <algorithm>
#include <iostream>
#include <random>
#include <numeric>
#include <chrono>
#include <iterator>
using namespace std;
using namespace chrono;
int main() {
int box[10]{};
iota(begin(box), end(box), 0);
const auto seed = static_cast<unsigned>(system_clock::now().time_since_epoch().count());
shuffle(begin(box), end(box), default_random_engine(seed));
copy(begin(box), end(box), ostream_iterator<int>(cout, " "));
puts("");
system("pause > nul");
}

P.S. То же самое, только на C++ :)

Аватар пользователя
Искусственный Интеллект

Очень топорно написанная программа. Совершенно не нужная булевская переменная, лишний цикл...
Вообще это рационально делается совсем иначе, не сравнениями с уже взятыми значениями, а тасованием чисел, например, по Кнуту. Это куда проще, но еще проще использовать готовые функции C++:

#include "iostream"
#include "cstdlib"
#include "ctime"
#include "algorithm"
using namespace std;
int main(){
const int n=10; int a[n]; srand(time(NULL));
iota(a,a+n,0); random_shuffle(a,a+n);
for(int i:a)cout<<i<<' ';}

Аватар пользователя
Просветленный

во вложенном цикле - проверяется есть ли сгенерированное значение среди элементов массива. перепиши без вложенного цикла