C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++11のランダムライブラリ(<random>)を使って乱数を生成する方法

C++11では、標準ライブラリの <random> ヘッダを使用することで、高品質な乱数を簡単に生成できるようになりました。従来の rand() 関数と比べて、分布の制御や乱数の品質が大幅に向上しており、現代のC++における乱数生成の推奨手法となっています。

乱数生成の基本的な仕組み

C++11の乱数生成は、主に次の3つの要素で構成されます。

  • random_device:OSから真にランダムなデータを取得する非決定的な乱数生成器。シードの供給源として利用します。
  • mt19937:メルセンヌ・ツイスタと呼ばれる擬似乱数生成エンジン。高速で長い周期を持つため広く使われています。
  • distribution(分布):一様分布や正規分布など、乱数の取り得る範囲や確率分布を定義します。

この記事の例では、random_device を一度だけ使い、mt という名前の乱数生成器オブジェクト(mt19937)のシードを初期化しています。random_devicemt19937 よりも動作が遅いという欠点がありますが、手動でシードを用意する必要がなく、OSに対して直接ランダムデータを要求するため、毎回異なる乱数列を得られるのが大きな利点です。

サンプルコード

以下は、20.0〜22.0の範囲で一様分布する実数(double型)の乱数を20個生成し、標準出力に表示するプログラムです。

#include <random>
#include <iostream>
using namespace std;

int main() {
    random_device rd;                              // シード取得用の乱数デバイス
    mt19937 mt(rd());                              // メルセンヌ・ツイスタエンジンをシードで初期化
    uniform_real_distribution<double> dist(20.0, 22.0); // 範囲は20から22

    for (int i = 0; i < 20; ++i)
        cout << dist(mt) << endl;
}

コードのポイント

  • random_device rd; … OSが提供するハードウェア的な乱数源から値を取得します。
  • mt19937 mt(rd()); … エンジンの構築時にシードを渡すことで、実行ごとに異なる乱数列を生成できます。
  • uniform_real_distribution<double> dist(20.0, 22.0); … 指定した閉区間 [20.0, 22.0] の範囲で一様に分布する実数を返します。整数の一様乱数が必要な場合は uniform_int_distribution を使用します。
  • dist(mt) … 分布オブジェクトにエンジンを渡して呼び出すことで、実際の乱数値を1つ取得します。

実行結果

実行環境によって出力される値は毎回異なりますが、以下のような出力が得られます。

21.5311
21.7195
21.0961
21.9679
21.197
21.2989
20.6333
20.441
20.7124
20.2654
21.1877
20.4824
20.0575
20.9432
21.222
21.162
21.1029
20.2253
21.5669
20.3357

すべての値が指定範囲である20.0以上22.0未満に収まっていることが確認できます。

まとめ

C++11の <random> ライブラリを使えば、「シード取得 → 乱数エンジン → 分布」という明確な設計で、目的に応じた高品質な乱数を柔軟に生成できます。rand() よりも再現性・精度・安全性の面で優れているため、新規プロジェクトでは必ずこちらを採用しましょう。

  1. Pythonのsecretsモジュールで安全な乱数とトークンを生成する方法

    暗号学的に安全な乱数を生成したい場合は、Python標準ライブラリのsecretsモジュールを利用します。このモジュールは、セキュリティ強度の高いパスワードやアカウント認証用のトークンなど、機密性の高いデータを作成する際に特に有効です。 一般的なrandomモジュールは予測可能な擬似乱数を返すため、認証用途には適していません。その点、secretsモジュールはOSが提供する高品質な乱数源(CSPRNG)にアクセスします。 secretsモジュールのクラスや関数を使用するには、まずコード内でインポートします。 import secrets 乱数の生成 secretsモジュールは、オペレーティ

  2. Rubyで乱数とランダム文字列を生成する方法を徹底解説

    Rubyで乱数やランダムな文字列を生成する方法を学びたいなら、ここがまさにうってつけの場所です。 この記事では、Rubyにおける乱数生成のさまざまなテクニックを、具体例とともにわかりやすく解説します。 乱数を使えば、配列からランダムに要素を選んだり、リストから当選者を抽選したり、サイコロの目をシミュレートしたりと、幅広い用途に活用できます。 Rubyには、性質の異なる複数の乱数生成方法が用意されています。 たとえば… randメソッドには3通りの使い方があります。 引数なしでrandを呼び出すと、0から1までの浮動小数点数(例: 0.4836732493)が返される 整数を引数に渡す(ran