AUTOSAR C++14 Rule A26-5-2

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

Описание

Управляйте определением

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

Объяснение

Генераторы псевдослучайного числа зависят от начального значения seed, чтобы сгенерировать последовательность случайных чисел. Инициализация по умолчанию механизмов случайных чисел сделана при помощи seed по умолчанию, который является постоянным значением. Если вы вызываете генератор случайных чисел, который имеет инициализацию по умолчанию многократно, вы получаете ту же последовательность каждый раз. Чтобы сгенерировать неповторяющиеся последовательности случайных чисел, используйте уникальные, значения 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 это правильно инициализируется.

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

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