Другие языки программирования и технологии

C++ помогите найти ошибочку в коде

Задачка такая: забить массив из 10 элементов, 10 случайными числами от 0-20, но, чтобы они не повторялись. Внутри цикла, который заполняет массив рандомными числами, сделал вложенный цикл, которые пробегает уже по существующим элементам в массиве и сравнивает их с текущим. Если найдено совпадение - генерировать новое число, а счетчик пробега обнулить и пробежать по-новой. Но чота не робит.
if (array[j] == array[i]) {
array[i] = rand() % 10 + 10;
j = 0;
}
Алексей Ли
Алексей Ли
602
Подозреваю, что когда ты обнуляешь цикл, то он больше не проверяет элемент 0, т. к. в момент итерации происходит j++.
Попробуй вместо j=0; сделать j=-1;

могу ошибаться...
Игорь Николаев
Игорь Николаев
7 947
Лучший ответ
Алексей Ли А ведь так и получается! Он же начинает с j=1, а не 0, соответственно, он уже не сравнивает с первым элементом в массиве и повтор получается всегда именно с первым элементом
Алексей Ли спасибо, теперь все как надо)
1. Ты генерируешь случайные числа в диапазоне 10..19, а не 0..20. В обеих местах должно быть:
array[i] = rand() % 21;

2. Создай массив из 21 элемента с числами 0..20, перемешай его и возьми первые 10 элементов.

// создаём массив
int array[21];
for (int i = 0; i < 21; ++i) { array[i] = i; }
// перемешиваем и выводим 10 элементов массива
for (int i = 0; i < 10; ++i) {
int j = rand() % (21 - i) + i;
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
cout << array[i] << endl;
}
// Игра: найди массив в коде)

#include <iostream>
#include <random>
#include <set>
#include <array>
#include <algorithm>
#include <chrono>
#include <iterator>
using namespace std;
int main() {
const auto n = 10U;
array<int, n> box;
set<int> tmp;
const uniform_int_distribution<> uid(0, 20);
mt19937 gen{ random_device()() };
while (tmp.size() < n) tmp.insert(uid(gen));
copy(tmp.begin(), tmp.end(), box.begin());
const auto seed = static_cast<unsigned>(chrono::system_clock::now().time_since_epoch().count());
shuffle(box.begin(), box.end(), default_random_engine(seed));
copy(box.begin(), box.end(), ostream_iterator<int>(cout, "\n"));
cin.get();
}
Виктор М
Виктор М
52 114
Алексей Ли аааа, че тут происходит)
быть может он опять сгенерировал число 12, и пошел дальше. Там ж нет бесконечной проверки.
Пробни прост во втором цикле, если встретил подобие, сделать break, и i--;

И зачем обнулять j, если цикл for итак начинает с нуля..
-------------------------------------------------------------------------------
UPD:
Ошибся, все же есть. Вот почему ты обнуляешь j)) чтобы еще раз проверить
Павел Полухин
Павел Полухин
73 465
Алексей Ли Xttx снизу подсказал, что j нужно присваивать -1, так как в начале цикла, он увеличивается сразу на 1. Соответственно, у меня как правило повторялись элементы с 1-ым элементом массива, так как он выпадал из проверки