C/C++

Задача по С++, генератор случайных чисел(сортирует что бы не было одинаковых чисел))

srand(time(NULL));


const int SIZE = 10;
int arr[SIZE];
bool TRUFALSE;



for (int i = 0; i < SIZE; )
{
TRUFALSE = false;
int ROW = rand() % 20;

for (int j = 0; j < i; j++)
{
if (arr[j] == ROW)
{
TRUFALSE = true;
break;
}
}

if (!TRUFALSE)
{
arr[i] = ROW;
i++;
}
}

for (int i = 0; i < SIZE; i++)
{
cout << arr[i]<< endl;
}
return 0;
}

Ребятки помогите разобраться, прошу не пинаться новичек в программировании, задача взята с урока по с++.

Не могу понять. Есть цикл for ограниченная константой size 10, в цикле интовая локальная переменная ROW, куда мы ложем случайное число, создаем вложенный цикл j (Вопрос нахрена?). Ладно создали в цикле j пытаемся сравнить массив arr[j]==ROW, ВОПРОС как попала рандомное число в массив Arr[j]??? не могу понять логики, я понимаю что мы их сравниваем и если они одинаковые то выполняется bool переменная, выходим с помощью break; , входим в ветвление с if (!TRUFALSE) там постепенно заполняется наш массив, ну и выводим массив в цикле. (Если мыслей по древу, что то не так описал поправьте)
В цикле по i, пока массив не заполнен полностью (i < SIZE):
  1. Генерируем очередное случайное число (ROW).
  2. Во вложенном цикле по j ищем значение ROW в уже заполненной части массива arr (TRUEFALSE == true - число найдено, false - не найдено).
  3. Если не найдено, добавляем значение ROW в массив (arr[i] = ROW) и увеличиваем заполненную часть массива (i++).

P.S. Говнокод вульгарис.

P.P.S. Для случая, когда и размер массива, и диапазон случайных чисел малы:
 #include 
#include
#include

using namespace std;

int main() {
srand(time(NULL)); // инициализация генератора случайных чисел

const int SIZE = 10; // размер итогового массива
const int RANGE = 20; // диапазон случайных чисел

vector arr(RANGE); // Создание массива для всех чисел диапазона
iota(arr.begin(), arr.end(), 0); // Заполнение массива числами 0..RANGE-1
random_shuffle(arr.begin(), arr.end()); // Перемешивание массива

arr.resize(SIZE); // Обрезание массива до нужного размера
for (auto v: arr) { cout
K♛
King ♛
87 930
Лучший ответ
Алибек Таукенов все равно не пойму логики, как Мы заполняем массив arr c помощью цикла j



Вот к примеру я понимаю такой пример
const int size = 10;
int Arrey[size];

for (int i = 0; i < size; i++)
{
Arrey[i]= rand()%100;
cout << Arrey[i]<<endl;
}
мы перебираем каждым циклом массив и выводи, но при этом присваиваем рандомное число, а в программе выше как мы присваиваем рандомное число массиву и при этом сравниваем если мы его присваиваем то оно по логике должно за один цикл совпадать с RAW. Короче запутался совсем
Алибек Таукенов Все понял, в j он как бы блок с записанными в массиве рандо числами и если через Row попадает такое же, то другое ветвление. Спасибо тебе добрый человек. Добра и любви тебе
Если есть вопрос "нахрена", то пробуй убрать и смотри, что получится
Андрей Егоров
Андрей Егоров
10 204
Это ужасная программа, которую лучше просто отправить в /dev/null и написать новую, нормальную.
Во-первых, само использование функции rand в Си++ уже намекает на то, что аффтор сего программистского опуса малость не в теме. Дело в том, что ГСЧ, реализуемый функцией rand, далеко не шедевр. В мане по rand приводится такая возможная реализация:
 static unsigned long next = 1; 
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
next = next * 1103515245 + 12345;
return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned int seed) {
next = seed;
}
Это лучше, чем ничего, если нет альтернативы, но в Си++ она есть. Для этого надо добавить в начало программы #include <random>
После этого вам будет доступно несколько ГСЧ, в частности mt19937 , который, особенно при полной инициализации, способен генерировать гораздо более качественные случайные числа. Мало того, есть еще такая штука, как распределение , которое позволяет отобразить вывод ГСЧ на какой-то диапазон. Т.е вместо того, чтобы писать rand()%20 можно просто задать границы распределения и оно все сделает само.
Далее, в Си++ есть такая штука как set , которая позволяет сохранять внутри себя введенное число и быстро проверять, есть уже такое число в сете или нет. Т.е. вместо всего того ужаса можно было бы запилить нормальный ГСЧ и вставлять его результаты в set, чтобы проверять, есть такое число или нет.
Константин __
Константин __
9 624

Похожие вопросы