Страница 1 из 1

Где закралась ошибка

Добавлено: 22 авг 2018, 17:06
Din666
Пытаюсь заполнить массив случайными уникальными числами

Никак не могу понять почему не вылетает исключение в том случае,
если разница между randomRangeMin и randomRangeMаx == 1

если разница больше - все ок

Код: Выделить всё

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

int main() {

    std::vector<int> array;
    auto randomRangeMin = 1;
    auto randomRangeMax = 2;
    auto randomRange = randomRangeMax - randomRangeMin;

    try {
    std::generate_n(
         std::back_inserter(array)
       , 10
       , [&](){
             int tryCount = 0;
             int rnd = 0;
             while (
                     (rnd = std::rand()%randomRange + randomRangeMin) > randomRangeMin // fake condition for assignment
                  && array.end() != std::find(array.begin(), array.end(), rnd) 
             ) {
                 if (tryCount >= randomRange ) {
                     throw std::logic_error("cant generate unique element for array");
                 }
                 ++tryCount;
             }
             return rnd;
         }
    );
    } catch ( const std::exception & err ) {
        std::cout << "Error: " << err.what() << std::endl;
    }

    std::copy(
          array.begin()
        , array.end()
        , std: :o stream_iterator<int>(std::cout, " ")
    );

    return EXIT_SUCCESS;
}
туплю под вечер наверно
результат работы:
1 1 1 1 1 1 1 1 1 1

Re: Где закралась ошибка

Добавлено: 23 авг 2018, 00:14
Romeo
Потому что остаток от деления на 1 всегда будет 0, так что ты никогда не заходишь в цикл уже по первому предикату. До второго предиката (поиска в векторе) даже не доходит дело :)

Re: Где закралась ошибка

Добавлено: 28 авг 2018, 12:02
Din666
Спасибо, действительно ведь ОСТАТОК от деления!!
На самом деле предложенный мной способ не самый оптимальный по скорости, лучше наверно заполнить массив последовательно числами и перемешать ))

Re: Где закралась ошибка

Добавлено: 28 авг 2018, 12:13
Romeo
Ну да, алгоритм был несколько надуман, но я об этом не стал писать, так как вопрос был в том, почему не работает :)