C++ 乱数ジェネレーター
インタラクティブなコード例でC++での乱数生成を学びましょう。rand()、srand()、<random>ライブラリ、std::uniform_int_distribution、std::mt19937を詳細な解説付きで紹介します。
すぐにランダムな数字が必要ですか?
コードを書かずに即座に結果を得られるオンライン乱数ジェネレーターをお試しください。
C++コードエディター
インタラクティブなコード例でC++での乱数生成を学びましょう。rand()、srand()、<random>ライブラリ、std::uniform_int_distribution、std::mt19937を詳細な解説付きで紹介します。
出力
シミュレートされた出力(C++はサーバーで実行)
「コードを実行」をクリックしてサンプル出力を確認
rand()を使ったクラシックなC++
<cstdlib>の伝統的なrand()関数を使用してランダムな整数を生成します。シンプルで広くサポートされていますが、乱数品質が低いため暗号アプリケーションには適していません。
C++の乱数生成を理解する
C++には複数の乱数生成方法があり、Cのシンプルなrand()関数からC++11のモダンな<random>ライブラリへと進化してきました。クラシックなrand()は線形合同生成器(LCG)を使用しsrand()でシード設定されますが、モダンなアプローチはMersenne Twisterアルゴリズムを使用し、異なるユースケースに向けた各種分布クラスを提供します。
rand() Function
<cstdlib>のクラシックなrand()関数は、シンプルな疑似乱数生成を提供します。srand()でシード設定され、線形合同生成器(LCG)アルゴリズムを使用します。基本的なアプリケーションに適していますが、暗号目的には適していません。
<random> Library
<random>ライブラリ(C++11以降)は、std::mt19937(Mersenne Twister)、uniform_int_distributionなどの各種分布を備えたモダンな乱数生成を提供し、rand()より優れた乱数品質を提供します。
uniform_int_distribution
std::uniform_int_distributionは、一様分布で整数範囲を正確に制御できます。統計アプリケーション、シミュレーション、正確な範囲制御が必要な場合に最適です。
std::mt19937
std::mt19937はMersenne Twisterアルゴリズムを実装し、優れた統計特性と非常に長い周期(2^19937-1)を提供します。ほとんどの<random>分布のデフォルトエンジンです。
一般的なユースケース
ゲーム&シミュレーション
rand()またはモダンな<random>ライブラリを使用して、ゲームループやシミュレーションでランダムなサイコロ、カード抽選、プロシージャル生成、ゲームイベントを生成。
セキュリティ&暗号
セキュリティアプリケーションでは、専門的な暗号ライブラリの使用を検討してください。標準のrand()は暗号学的に安全ではありません。パスワードやトークンにはプラットフォーム固有の安全な乱数生成器を使用してください。
ハイパフォーマンスコンピューティング
std::mt19937を備えたモダンな<random>ライブラリは、HPCや科学計算アプリケーションで大量の乱数を生成する際に優れたパフォーマンスを提供します。
ソフトウェアテスト
ランダム化されたテストデータ、ファズテスト入力、エッジケースを作成して、C++アプリケーションの堅牢なコードカバレッジとバグ検出を確保。
C++の乱数生成の仕組み
C++のクラシックな rand() 関数(next = (a * current + c) % m を使用して疑似乱数を生成します。数列は決定論的であり、srand() でシード設定する必要があります。
モダンな ライブラリ(C++11以降)は、Mersenne Twisterアルゴリズム(std::mt19937)を使用しており、はるかに優れた乱数品質と統計特性を提供します。また、uniform_int_distribution、normal_distribution、bernoulli_distributionなど、異なるユースケース向けの各種分布クラスも提供します。
std::random_device は、乱数エンジンのシード設定のためのプラットフォーム固有のエントロピーソースを提供し、プログラム実行のたびに異なる数列を生成します。
C++乱数生成のエキスパートヒント
新しいコードではrand()を避ける
新しいC++コード(C++11以降)では、rand()/srand()よりも
srand()は必ずシード設定する
rand()を使用する場合は、プログラム開始時に必ずsrand(std::time(0))を呼び出してジェネレーターをシード設定してください。そうしないと毎回同じ数列が生成されます。
適切な分布を使用する
一様な整数範囲にはstd::uniform_int_distributionを使用してください。浮動小数点数にはstd::uniform_real_distributionを使用します。これにより適切な統計特性が確保されます。
技術仕様
アルゴリズム
- 線形合同生成器(rand関数)
- Mersenne Twister(std::mt19937)
- プラットフォーム固有のエントロピーソース(std::random_device)
パフォーマンス特性
- rand():高速だが乱数品質が低い
- <random>:高速かつ優れた品質
- std::mt19937:大量生成に非常に高速