AUTOSAR C++14 Rule A26-5-2

Двигатели с случайными числами не должны быть инициализированы по умолчанию

Описание

Определение правила

Двигатели с случайными числами не должны быть инициализированы по умолчанию.

Объяснение

Генераторы псевдослучайных чисел зависят от начального начального значения, чтобы сгенерировать последовательность случайных чисел. Инициализация по умолчанию модулей случайных чисел осуществляется с помощью seed по умолчанию, которое является постоянным значением. Если вы вызываете генератор случайных чисел, который имеет инициализацию по умолчанию несколько раз, вы получаете одну и ту же последовательность каждый раз. Чтобы сгенерировать неповторяющиеся последовательности случайных чисел, используйте уникальные, не по умолчанию начальные значения каждый раз, когда вы инициализируете генератор случайных чисел.

Это правило препятствует генерации детерминированных последовательностей в производственном коде, где требуется случайность. Исключение из этого правила допускается, когда детерминированная последовательность требуется в целях последовательной проверки.

Реализация Polyspace

Шашка сообщает о нарушениях на линиях, в которых:

  • Стандартный генератор случайных чисел C++ инициализирован по умолчанию.

  • Функция заполнения генератора случайных чисел вызывается с помощью неявного вызова аргументов по умолчанию или явного default_seed аргумент..

Примечание

Проверка не сообщает о инициализациях двигателя случайных чисел, которые имеют постоянные входные параметры.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

Декларация std::default_random_engine eng1 не совместим, потому что он построен с помощью аргумента по умолчанию, default_seed константа.

#include <iostream>
#include <random>

int main()
{
  std::default_random_engine eng1{};     //Noncompliant
  std::uniform_int_distribution<int> ud2{0, 100};
  std::random_device rd;
  std::default_random_engine eng2{rd()}; //Compliant
  std::default_random_engine eng3{rd()}; //Compliant
  eng3.seed();                           //Noncompliant   

return 0;
}

Вторая декларация std::default_random_engine eng2 совместим, потому что требуется определяемая пользователем random_device объект как его аргумент инициализации.

Декларация std::default_random_engine eng3 также соответствует. eng3.seed() не совместима, потому что функция начального уровня std::default_random_engine seed использует default_seed константа как аргумент, который перезаписывает seed eng3 это правильно инициализировано.

Проверяйте информацию

Группа: Библиотека алгоритмов
Категория: Необходимый, Автоматизированный
Введенный в R2020b