メインコンテンツ

AUTOSAR C++14 Rule A26-5-2

Random number engines shall not be default-initialized

説明

ルール定義

Random number engines shall not be default-initialized.

根拠

疑似乱数発生器は、最初のシード値に依存して乱数シーケンスを生成します。既定では、乱数エンジンの初期化は、既定のシード値である定数を使用して行われます。既定の初期化が設定された乱数発生器を複数回呼び出すと、常に同じ乱数シーケンスが生成されます。異なるプログラム実行での同一乱数シーケンスの生成など、予期せぬプログラムの動作を回避するには、乱数発生器を初期化するたびに、既定ではない固有のシード値を使用します。

テストでの一貫性を確保するために、確定的なシーケンスが必要な場合は、このルールの例外が許可されます。

Polyspace 実装

チェッカーは、以下に該当する行で違反を報告します。

  • C++ 規格の乱数発生器の既定の初期化が行われる行。

  • 乱数発生器のシード関数が、既定の引数または明示的な引数 default_seed の暗黙的な呼び出しを使用して呼び出される行。

メモ

チェッカーは、一定の入力引数を使用する乱数エンジンの初期化を報告しません。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

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;
}

2 番目の std::default_random_engine eng2 の宣言は、初期化の引数としてユーザー定義の random_device オブジェクトを取っているため、準拠しています。

std::default_random_engine eng3 の宣言も準拠しています。eng3.seed() は非準拠です。これは、シード関数 std::default_random_engine seed で引数として使用されている default_seed 定数が、eng3 を適切に初期化するシード値を上書きするためです。

チェック情報

グループ: アルゴリズム ライブラリ
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入