+ Ответить в теме
Показано с 1 по 4 из 4

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

  1. #1
    programmer Din666 will become famous soon enough Din666 will become famous soon enough Аватар для Din666
    Регистрация
    17.07.2015
    Адрес
    Moscow
    Сообщений
    50
    Вес репутации
    5

    По умолчанию Где закралась ошибка

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

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

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


    Код :
    1. #include <iostream>
    2. #include <iterator>
    3. #include <algorithm>
    4. #include <vector>
    5.  
    6. int main() {
    7.  
    8.     std::vector<int> array;
    9.     auto randomRangeMin = 1;
    10.     auto randomRangeMax = 2;
    11.     auto randomRange = randomRangeMax - randomRangeMin;
    12.  
    13.     try {
    14.     std::generate_n(
    15.          std::back_inserter(array)
    16.        , 10
    17.        , [&](){
    18.              int tryCount = 0;
    19.              int rnd = 0;
    20.              while (
    21.                      (rnd = std::rand()%randomRange + randomRangeMin) > randomRangeMin // fake condition for assignment
    22.                   && array.end() != std::find(array.begin(), array.end(), rnd)
    23.              ) {
    24.                  if (tryCount >= randomRange ) {
    25.                      throw std::logic_error("cant generate unique element for array");
    26.                  }
    27.                  ++tryCount;
    28.              }
    29.              return rnd;
    30.          }
    31.     );
    32.     } catch ( const std::exception & err ) {
    33.         std::cout << "Error: " << err.what() << std::endl;
    34.     }
    35.  
    36.     std::copy(
    37.           array.begin()
    38.         , array.end()
    39.         , std::ostream_iterator<int>(std::cout, " ")
    40.     );
    41.  
    42.     return EXIT_SUCCESS;
    43. }

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

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

    По умолчанию Re: Где закралась ошибка

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

  4. #3
    programmer Din666 will become famous soon enough Din666 will become famous soon enough Аватар для Din666
    Регистрация
    17.07.2015
    Адрес
    Moscow
    Сообщений
    50
    Вес репутации
    5

    По умолчанию Re: Где закралась ошибка

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

  5. #4
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    37
    Сообщений
    3,091
    Вес репутации
    21

    По умолчанию Re: Где закралась ошибка

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

+ Ответить в теме

Похожие темы

  1. Где ошибка?
    Задание. Заданы коэффициенты а,б и ц биквадратного уравнения ax4+bx2+c=0.Найти все его действительные корни. Программа вроде работает,но всегда...
    от Conner в разделе задачи на Паскале и Delphi
  2. Ошибка
    Объясните,пожалуйста что мне делать,если у меня компьютер постоянно (когда ему захочется)выдает сообщение: "Система завершает работу.сохраните...
    от Альбина в разделе Операционные системы
  3. В чём ошибка?
    Подскажите В чём ОШИБКА? unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...
    от scorpi.on в разделе Delphi и Pascal
  4. ошибка IIS
    Здравствуйте! На сервере, где поднят IIS, в журнале событий системы постоянно появляется одно и то же предупреждение: источник V3SVC, код - 100 "не...
    от Rinne в разделе Apache, IIS...
  5. Ошибка
    Failed sending email :: PHP :: DEBUG MODE Line : 235 File : /home/developingru/www/forum/includes/emailer.php
    от DeeJayC в разделе Жалобная книга

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения