заполнить масив неповторяющимися числами с помощью Random()?

  • Автор темы woka
  • Дата начала
W

woka

ребята подскажите! мне надо зарандомировать матрицу. всмысле масив забить числами. но не всё так просто. надо чтобы эти числа были до определённого количества и не повторялись.
я придумал что то вроде этого чтобы заполнить масив
C++:
for (i=0;i<n;i++)
for (j=0;j<n;j++)
m[i][j]=random (15);
а вот чтобы проверить встречаются ли тут такие мыслей собственно почти не.
конечно можно было бы сделать несколько циклов чтобы они проверяли не ли нового элемента и вызывали опять рандом на этот элемент но это всё будет занимать много времени.
 
D

Dock1100

можно сделать так :
создать масив с неповторяющимися числами в нужны пределах (типа 5,6,7,8,9,10,11,12,13,14,15,16...)
хаотично перемешать масив
и истпользовать его вместо random();

Добавлено :
Код:
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
const int array_size = 15;
int array[ array_size ];
int t = 0;
int k = 0;
for (int i=0; i<array_size; ++i)
{
array[i]=i;
cout << " a[" << i <<"]="<< array[i];
}
cout << "\n";
srand(array_size-1);
for (int i=0; i<array_size; ++i)
{
k = rand() % (array_size-1);
t = array[i];
array[i] = array[k];
array[k] = t;
}
for (int i=0; i<array_size; ++i)
{
cout << " a[" << i <<"]="<< array[i];
}
return 0;
}
 
W

woka

спасибо конечно но я уже нашёл выход из ситуации сделав заполнение этого массива из файла. я посчитал что так будет проще. да и кода в разы становиться меньше.
 
L

lazybiz

А в файле откуда случайные числа появляются?
 
L

lazybiz

Так это уже нельзя назвать случайными числами! А все (в том числе условие) гласит об обратном!!
 
R

rrrFer

Так это уже нельзя назвать случайными числами! А все (в том числе условие) гласит об обратном!!
да ладно...главно ТС решил свою проблему ;)
скорее всего ему просто было лень каждый раз при запуске программы заполнять матрицу руками
 
W

woka

up
как видно несошлись(
после нескольких часов самопыток ничего толкового не придумав вспомнил про тему когда то созданую.
смотрел алгоритм уважаемого Dock1100 и не понимаю как он работает но факт что работает. не знаю буду пробовать разобраться если ничего проще не найду.
тут есть мысли чтобы сделать сначало обычное заполнение массива а потом по принцыпу поиска находить повторяющиеся.
 
D

Dock1100

не понимаю как он работает
Код:
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
const int array_size = 15;
int array[ array_size ];
int t = 0;
int k = 0;
for (int i=0; i<array_size; ++i) //заполняем масив последовательными числами от 0 до 14 и выводим их
{
array[i]=i;
cout << " a[" << i <<"]="<< array[i];
}
cout << "\n";
srand(0); //задаём начальное число для генератора случайных чисел
for (int i=0; i<array_size; ++i)
{
k = rand() % (array_size-1); //поскольку rand() возвращает числа от начального числа до максимума типа int, то результат необходимо преобразовать путём получения остатка от диления rand() на длину(в данном случае кол-во элементов в масиве) диапазона

//меняем местами два элемента: текущий и елемент со случайним номером
t = array[i];
array[i] = array[k];
array[k] = t;
}
for (int i=0; i<array_size; ++i) //выводим результат
{
cout << " a[" << i <<"]="<< array[i];
}
return 0;
}
 
W

woka

:lovecodeby: я фигею! несколько раз прошёл по шагам тот кусок кода где он рандамирует и не пойму как это просходит.
блин! ну я и баран. :ya_lamo: он же его просто меняет местами!фак. спасибо большое. :lovecodeby:
у меня были идеи на этот счёт чтобы заполнить массив и потом уже разбрасать их, :lovecodeby: но не смог придумать как их потом раскидать. Спасибо!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!