exponenta event banner

Правило AUTOSAR C++ 14 A26-5-2

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

Описание

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

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

Объяснение

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

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

Внедрение 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 константа в качестве аргумента, который перезаписывает начальное число eng3 это правильно инициализировано.

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

Группа: Библиотека алгоритмов
Категория: Обязательно, Автоматизировано
Представлен в R2020b