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 это правильно инициализируется.

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

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