Сижу, ломаю голову - и все никак не получается. Нужно создать массив из случайных чисел в диапозоне от 1 до 7 и чтобы там не было повторений. Я знаю, что есть много вариантов решения, но я выбрал следующий: при генерации числа заносить его в массив, а при генерации следующего пробегаться по массиву в поисках совпадения. Если найдено, то генерировать заново. Написал код, вроде бы все легко, но в ответе все равно проскальзывают повторения. Подскажите, где косяк?
#include "pch.h"
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
srand(time(0));
int a[7] = {0,0,0,0,0,0,0}; //создаю массив и заполняю нулями
int random; //переменная для случайных чисел
for (int i = 0; i < 7; i++) { //цикл создания случайных чисел
random = 1 + rand() % 7; //создание случайного числа
for (int j = 0; j < 7; j++) { //цикл проверки массива на совпадение
if (random == a[j]) { //условие совпадения
while (random == a[j]) { //цикл для создания нового случайного числа, пока оно не будет повторяться
random = 1 + rand() % 7;
}
}
else {
continue; //если повтора нет, переходим к следующей итерации
}
}
a[i] = random; // присваивание рандомного числа элементу массива
}
for (int k = 0; k < 7; k++) { //вывод массива на экран
cout << a[k];
}
cout << "Для выхода из консоли нажмите любую клавишу";
_getch();
return 0;
}
Ответ
Для такого малого количества просто возьмите массив {1,2,3,4,5,6,7} и случайным образом его перетасуйте (например, с помощью shuffle). Будет быстрее и проще.
А ваша проблема в том, что, проверив число на равенство одному a[j] и откорректировав, вы тут же об этом забываете при проверке на следующее значение j. Т.е. ваш цикл должен выглядеть примерно как
for (int i = 0; i < 7; i++)
{
for(;;)
{
bool good = true;
random = 1 + rand() % 7;
for (int j = 0; j < 7; j++)
{
if (random == a[j]) { good = false; break; }
}
if (good) break;
}
a[i] = random; // присваивание рандомного числа элементу массива
}
Комментариев нет:
Отправить комментарий