Обнуление определенной части двумерного массива

  • Автор темы Alex430
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Alex430

#1
Есть cnt_0 - число элементов массива, которые подлежат обнулению. p[j] - массив, сформированный динамически с рахмерами n на m и забит рандомными числами от 0 до 9.
Данный код обнуляет приближенное к cnt_0 число значений массива p. (Приближенное т.к. возможны повторения случайных i и j) Обнуление без ошибок происходит при размерах матрицы до 100 на 100 элементов, иногда выполняется и при немного больших размерах матрицы.
C++:
	srand((unsigned)(time(NULL)));
for(double k=0; k<=cnt_0; k++)			//зануление
{
i=int((double)rand()/RAND_MAX*n);
j=int((double)rand()/RAND_MAX*m);
p[i][j]=0;
}
Код ниже, обнуляет cnt_0-1 элементов матрицы при ее небольших размерах.
C++:
	pair <int, int> pr;
vector <pair<int,int>> v_pr;
vector <pair<int, int>>::iterator v_it;

for(double k=0; k<cnt_0; k++)		  
{
if(b) //первый проход с обнулением, вектор пар пока пуст
{
i=int((double)rand()/RAND_MAX*n);
j=int((double)rand()/RAND_MAX*m);
pr.first = i;
pr.second = j;
v_pr.push_back(pr);
p[i][j]=0;
b=!b;
}
else //последующие проходы с генерацией новых уникальных координат для обнуления
{
i=int((double)rand()/RAND_MAX*n);
j=int((double)rand()/RAND_MAX*m);
for(v_it=v_pr.begin(); v_it!=v_pr.end(); v_it++)
{
if(v_it->first==i && v_it->second==j)
{
i=int((double)rand()/RAND_MAX*n);
j=int((double)rand()/RAND_MAX*m);
v_it = v_pr.begin();
}
}
pr.first = i;
pr.second = j;
v_pr.push_back(pr);
p[i][j]=0;
}
}
Не могу понять, в чем проблема с обнулением большого числа элементов... ;)
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Есть cnt_0 - число элементов массива, которые подлежат обнулению. p[j] - массив, сформированный динамически с рахмерами n на m и забит рандомными числами от 0 до 9.
Данный код обнуляет приближенное к cnt_0 число значений массива p. (Приближенное т.к. возможны повторения случайных i и j) Обнуление без ошибок происходит при размерах матрицы до 100 на 100 элементов, иногда выполняется и при немного больших размерах матрицы.
srand((unsigned)(time(NULL)));
for(double k=0; k<=cnt_0; k++) //зануление
{
i=int((double)rand()/RAND_MAX*n);
j=int((double)rand()/RAND_MAX*m);
p[j]=0;
}

А для чего вообще может потребоваться "обнулять сам не знаешь чего" ?
Ну ладно, наверное для чего то нужно.....
Ну вот слушай....
Массив - это упорядоченное в памяти совокупность значений (размерность элемента),
тоесть массив у тебя идет A[0..10000.. и т.д.] A[0] - адрес начала массива или указатель на первый его элемент,
A[1] - это указатель на второй элемент путем сдвига памяти на 1*sizeof(ТИП ЭЛЕМЕНТОВ МАССИВА)
Ты определяешь динамически массив пусть будет его размерность 100000 (сто тысяч элементов)
как ты только выйдишь за границы массива например A[100000] - это уже все (не наш массив), реально что возникнит ошибка смотря что или куда прочитать и записать...
поэтому при таком раскладе твой идекс должен быть в передалх от [0..99999]
поэтому примерно делаем так i = rand() % 100000 (остаток от делаения на 100000, вернет чисор от [0..99999]
А что ты делаешь это по моему по меньшей мере не правельно, и не знаю точно но RAND_MAX*n это может попахивать переполнением
 
A

Alex430

#3
Обнуляю случайные элементы массива, их число высчитывается из заданных в программе % нулей. Необходимо это для анализа времени и коэффициента сжатия различных алгоритмов при работе с матрицами, имеющими большое количеством нулевых элементов. Спасибо, запись i=rand()%n; j=rand()%m; решила проблему.
 
Статус
Закрыто для дальнейших ответов.