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) там постепенно заполняется наш массив, ну и выводим массив в цикле. (Если мыслей по древу, что то не так описал поправьте)
C/C++
Задача по С++, генератор случайных чисел(сортирует что бы не было одинаковых чисел))
В цикле по i, пока массив не заполнен полностью (i < SIZE):
P.S. Говнокод вульгарис.
P.P.S. Для случая, когда и размер массива, и диапазон случайных чисел малы:
- Генерируем очередное случайное число (ROW).
- Во вложенном цикле по j ищем значение ROW в уже заполненной части массива arr (TRUEFALSE == true - число найдено, false - не найдено).
- Если не найдено, добавляем значение 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
Если есть вопрос "нахрена", то пробуй убрать и смотри, что получится
Это ужасная программа, которую лучше просто отправить в /dev/null и написать новую, нормальную.
Во-первых, само использование функции rand в Си++ уже намекает на то, что аффтор сего программистского опуса малость не в теме. Дело в том, что ГСЧ, реализуемый функцией rand, далеко не шедевр. В мане по rand приводится такая возможная реализация:
После этого вам будет доступно несколько ГСЧ, в частности mt19937 , который, особенно при полной инициализации, способен генерировать гораздо более качественные случайные числа. Мало того, есть еще такая штука, как распределение , которое позволяет отобразить вывод ГСЧ на какой-то диапазон. Т.е вместо того, чтобы писать rand()%20 можно просто задать границы распределения и оно все сделает само.
Далее, в Си++ есть такая штука как set , которая позволяет сохранять внутри себя введенное число и быстро проверять, есть уже такое число в сете или нет. Т.е. вместо всего того ужаса можно было бы запилить нормальный ГСЧ и вставлять его результаты в set, чтобы проверять, есть такое число или нет.
Во-первых, само использование функции 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, чтобы проверять, есть такое число или нет.
Похожие вопросы
- Где взять генератор случайных чисел
- Для всех задач сформировать одномерный массив N случайных чисел из интервала (-10; 10).
- Помогите пожалуйста с Массивами .В языке С .Заполнил 2-мерный массив N и M случайными числами дальше не понимаю.
- Помогите пожалуйста написать программу, реализующую десять генераторов псевдослучайных чисел.СИ!!!!
- Создать одномерный массив, состоящий из n вещественных элементов. Элементы массива определить при помощи случайных чисел
- Как проверить одинаковые числа в массиве без повторений на С++
- Сформировать матрицу B(M, N) элементами которой являются случайные числа, равномерно распределенные в интервале (-5, 7
- Массив Х [36] целых элементов задать датчиком случайных чисел.
- Заполнить 2D массив случайными числами
- 5) Найти среднее значение элементов построчно и по столбцам массива n*n случайных чисел. с++ пж помагите
Вот к примеру я понимаю такой пример
const int size = 10;
int Arrey[size];
for (int i = 0; i < size; i++)
{
Arrey[i]= rand()%100;
cout << Arrey[i]<<endl;
}
мы перебираем каждым циклом массив и выводи, но при этом присваиваем рандомное число, а в программе выше как мы присваиваем рандомное число массиву и при этом сравниваем если мы его присваиваем то оно по логике должно за один цикл совпадать с RAW. Короче запутался совсем