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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Alex430, 17 окт 2010.

Статус темы:
Закрыта.
  1. Alex430

    Alex430 Гость

    Есть 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;
    }
    }
    Не могу понять, в чем проблема с обнулением большого числа элементов... ;)
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0

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

    Alex430 Гость

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

Поделиться этой страницей