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() 関数(から)は線形合同生成器(LCG)アルゴリズムを使用します。公式 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:大量生成に非常に高速