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

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

  1. woka

    woka Гость

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

    Dock1100 :-]

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

    Добавлено :
    Код (Text):
    #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 Гость

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

    lazybiz Well-Known Member
    C\C++ Team

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

    woka Гость

    сам его заполняешь как хочешь!
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

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

    lazybiz Well-Known Member
    C\C++ Team

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

    woka Гость

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

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Код (Text):
    #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 Гость

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

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