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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Din666
Сообщения: 51
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

22 авг 2018, 17:06

Пытаюсь заполнить массив случайными уникальными числами

Никак не могу понять почему не вылетает исключение в том случае,
если разница между 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
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

23 авг 2018, 00:14

Потому что остаток от деления на 1 всегда будет 0, так что ты никогда не заходишь в цикл уже по первому предикату. До второго предиката (поиска в векторе) даже не доходит дело :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 51
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

28 авг 2018, 12:02

Спасибо, действительно ведь ОСТАТОК от деления!!
На самом деле предложенный мной способ не самый оптимальный по скорости, лучше наверно заполнить массив последовательно числами и перемешать ))
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

28 авг 2018, 12:13

Ну да, алгоритм был несколько надуман, но я об этом не стал писать, так как вопрос был в том, почему не работает :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить