C++11のランダムライブラリ(<random>)を使って乱数を生成する方法
C++11では、標準ライブラリの <random> ヘッダを使用することで、高品質な乱数を簡単に生成できるようになりました。従来の rand() 関数と比べて、分布の制御や乱数の品質が大幅に向上しており、現代のC++における乱数生成の推奨手法となっています。
乱数生成の基本的な仕組み
C++11の乱数生成は、主に次の3つの要素で構成されます。
- random_device:OSから真にランダムなデータを取得する非決定的な乱数生成器。シードの供給源として利用します。
- mt19937:メルセンヌ・ツイスタと呼ばれる擬似乱数生成エンジン。高速で長い周期を持つため広く使われています。
- distribution(分布):一様分布や正規分布など、乱数の取り得る範囲や確率分布を定義します。
この記事の例では、random_device を一度だけ使い、mt という名前の乱数生成器オブジェクト(mt19937)のシードを初期化しています。random_device は mt19937 よりも動作が遅いという欠点がありますが、手動でシードを用意する必要がなく、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() よりも再現性・精度・安全性の面で優れているため、新規プロジェクトでは必ずこちらを採用しましょう。
-
Pythonのsecretsモジュールで安全な乱数とトークンを生成する方法
暗号学的に安全な乱数を生成したい場合は、Python標準ライブラリのsecretsモジュールを利用します。このモジュールは、セキュリティ強度の高いパスワードやアカウント認証用のトークンなど、機密性の高いデータを作成する際に特に有効です。 一般的なrandomモジュールは予測可能な擬似乱数を返すため、認証用途には適していません。その点、secretsモジュールはOSが提供する高品質な乱数源(CSPRNG)にアクセスします。 secretsモジュールのクラスや関数を使用するには、まずコード内でインポートします。 import secrets 乱数の生成 secretsモジュールは、オペレーティ
-
Rubyで乱数とランダム文字列を生成する方法を徹底解説
Rubyで乱数やランダムな文字列を生成する方法を学びたいなら、ここがまさにうってつけの場所です。 この記事では、Rubyにおける乱数生成のさまざまなテクニックを、具体例とともにわかりやすく解説します。 乱数を使えば、配列からランダムに要素を選んだり、リストから当選者を抽選したり、サイコロの目をシミュレートしたりと、幅広い用途に活用できます。 Rubyには、性質の異なる複数の乱数生成方法が用意されています。 たとえば… randメソッドには3通りの使い方があります。 引数なしでrandを呼び出すと、0から1までの浮動小数点数(例: 0.4836732493)が返される 整数を引数に渡す(ran