1. Уважаемые участники и гости, 19 октября codeby будет работать в режиме "Только чтение". Регистрация новых участников будет закрыта. 20 октября портал продолжит работу в прежнем режиме.

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

Тема в разделе "Общие вопросы по С и С++", создана пользователем woka, 15 сен 2011.

  1. woka

    woka Гость

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

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    можно сделать так :
    создать масив с неповторяющимися числами в нужны пределах (типа 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;
    }
     
  3. woka

    woka Гость

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

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    А в файле откуда случайные числа появляются?
     
  5. woka

    woka Гость

    Репутация:
    0
    сам его заполняешь как хочешь!
     
  6. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Так это уже нельзя назвать случайными числами! А все (в том числе условие) гласит об обратном!!
     
  7. rrrFer

    rrrFer Гость

    Репутация:
    0
    да ладно...главно ТС решил свою проблему ;)
    скорее всего ему просто было лень каждый раз при запуске программы заполнять матрицу руками
     
  8. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Ну хоть на этом сошлись:)
     
  9. woka

    woka Гость

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

    Dock1100 :-]

    Репутация:
    0
    Регистрация:
    9 ноя 2009
    Сообщения:
    665
    Симпатии:
    1
    Код:
    #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;
    }
     
  11. woka

    woka Гость

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

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