乱数の生成

C++:
乱数の生成

どのようにして:

C++で乱数を生成するには、<random>ヘッダーを使用するのが一般的です。これはC++11で導入され、さまざまな分布から乱数を生成するための広範な設備を提供します。

#include <iostream>
#include <random>

int main() {
    // 乱数エンジンの初期化
    std::random_device rd;  
    std::mt19937 gen(rd()); 

    // 範囲 [0, 99] を定義
    std::uniform_int_distribution<> distrib(0, 99); 

    // 定義された範囲内で5つの乱数を生成して表示
    for(int n=0; n<5; ++n)
        std::cout << distrib(gen) << ' ';
    return 0;
}

このコードサンプルは、std::random_deviceからシードを取得してMersenne Twister乱数ジェネレータを初期化します。次に、範囲 [0, 99] で一様整数分布を定義し、最終的にこの分布から5つの乱数を出力します。

サンプル出力はこのような形になりますが、実行ごとに異なる結果が得られることが予想されます:

45 67 32 23 88

深入り:

歴史的に、C++における乱数生成は、rand()関数やシード設定のためのsrand()関数に大きく依存していました。これらの関数は<cstdlib>ヘッダーに含まれています。しかし、このアプローチは生成された数の分布の一様性や予測可能性の欠如のために、たびたび批判されてきました。

C++11で<random>ヘッダーが導入されたことは、乱数を生成する方法において顕著な改善をもたらしました。このヘッダーは、乱数を生成するための洗練されたシステムを提供し、プログラマーの特定のニーズに合わせて組み合わせることができる様々なエンジン(std::mt19937のようなMersenne Twister用)や分布(整数の一様分布のためのstd::uniform_int_distributionのような)を提供しています。これにより、より予測可能な振る舞い、より良いパフォーマンス、そしてより大きな柔軟性を実現しています。

<random>ライブラリは古いrand()アプローチよりもはるかに優れていますが、特に暗号目的のために真にランダムな数を生成することは、追加の配慮が必要であるという点に注意する価値があります。暗号学的アプリケーションのためには、しばしばハードウェアのエントロピーソースを利用する、セキュリティに特化した設計のライブラリが代わりに使用されるべきです。