C++ 乱数ジェネレーター
インタラクティブなコード例でC++での乱数生成を学びましょう。rand()、srand()、<random>ライブラリ、std::uniform_int_distribution、std::mt19937を詳細な解説付きで紹介します。
C++コードエディター
インタラクティブなコード例でC++での乱数生成を学びましょう。rand()、srand()、<random>ライブラリ、std::uniform_int_distribution、std::mt19937を詳細な解説付きで紹介します。
#include <iostream>
#include <random>
int main() {
int min = 1;
int max = 100;
int quantity = 5;
// Modern C++ random number generation
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
std::cout << "Modern C++ random numbers:" << std::endl;
for (int i = 0; i < quantity; i++) {
int num = dis(gen);
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
出力
ブラウザーでのプレビューで、JavaやC++を実行しません。値は暗号用途には使えません。
例をプレビュー
rand()を使ったクラシックなC++
<cstdlib>の伝統的なrand()関数を使用してランダムな整数を生成します。シンプルで広くサポートされていますが、乱数品質が低いため暗号アプリケーションには適していません。
すぐにランダムな数字が必要ですか?
コードを書かずに即座に結果を得られるオンライン乱数ジェネレーターをお試しください。
C++の乱数生成を理解する
rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
rand() Function
rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
<random> Library
<random>ライブラリ(C++11以降)は、std::mt19937(Mersenne Twister)、uniform_int_distributionなどの各種分布を備えたモダンな乱数生成を提供し、rand()より優れた乱数品質を提供します。
uniform_int_distribution
std::uniform_int_distributionは、一様分布で整数範囲を正確に制御できます。統計アプリケーション、シミュレーション、正確な範囲制御が必要な場合に最適です。
std::mt19937
rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
一般的なユースケース
ゲーム&シミュレーション
rand()またはモダンな<random>ライブラリを使用して、ゲームループやシミュレーションでランダムなサイコロ、カード抽選、プロシージャル生成、ゲームイベントを生成。
セキュリティ&暗号
rand() と std::mt19937 は暗号用途には使えません。セキュリティ用途には、仕様が確認できる暗号ライブラリーやOSのAPIを使ってください。std::random_device は移植可能な安全性保証ではありません。
ハイパフォーマンスコンピューティング
std::mt19937を備えたモダンな<random>ライブラリは、HPCや科学計算アプリケーションで大量の乱数を生成する際に優れたパフォーマンスを提供します。
ソフトウェアテスト
ランダム化されたテストデータ、ファズテスト入力、エッジケースを作成して、C++アプリケーションの堅牢なコードカバレッジとバグ検出を確保。
C++の乱数生成の仕組み
rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
std::random_device は実装依存で、決定的なエンジンを使う場合もあります。すべての環境で予測不能な出力を保証するものではありません。
実用上の注意
新しいコードではrand()を避ける
rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
シードを明示的に選ぶ
固定シードでは同じエンジンの数列を再現できます。C++のエンジンはシステムのエントロピーで自動初期化されません。必要に応じてシードを明示してください。
適切な分布を使用する
一様な整数範囲にはstd::uniform_int_distributionを使用してください。浮動小数点数にはstd::uniform_real_distributionを使用します。これにより適切な統計特性が確保されます。
技術仕様
アルゴリズム
- rand() のアルゴリズムは実装依存です。C++11では std::mt19937 などのエンジンと分布を分けて使います。分布に既定のmt19937エンジンはありません。
- Mersenne Twister(std::mt19937)
- std::random_device は実装依存で、決定的なエンジンを使う場合もあります。すべての環境で予測不能な出力を保証するものではありません。
パフォーマンス特性
- rand():高速だが乱数品質が低い
- <random>:高速かつ優れた品質
- std::mt19937:大量生成に非常に高速
よくある質問
どの C++ アプローチがカバーされていますか?
古典的な rand() と srand()、最新の <random> ライブラリ、std::uniform_int_distribution、および mt19937 エンジン。
サンプルをカスタマイズできますか?
はい。パラメーター パネルで最小値、最大値、数量を設定し、実行して出力を確認します。
現在推奨されるアプローチはどれですか?
名前付きディストリビューションとエンジンを備えた <random> ライブラリ。 rand() は古いコードでも存続しますが、品質と範囲が弱いという落とし穴があります。
ジェネレーターをシードするにはどうすればよいですか?
std::random_device は実装依存で、決定的なエンジンを使う場合もあります。すべての環境で予測不能な出力を保証するものではありません。
C++のrand()はどの範囲の値を返しますか?
rand() の範囲は0からRAND_MAXまでで、両端を含みます。Microsoft CRTでは32767です。ほかの環境にも同じ上限を仮定しないでください。
rand()は暗号学的に安全ですか?
rand() と std::mt19937 は暗号用途には使えません。セキュリティ用途には、仕様が確認できる暗号ライブラリーやOSのAPIを使ってください。std::random_device は移植可能な安全性保証ではありません。
C++でランダムな浮動小数点数を生成するには?
std::mt19937と、目的の区間(例:0.0から1.0)に設定したstd::uniform_real_distributionを組み合わせ、dist(generator)を呼び出します。結果はdouble型で、下限の値は含まれますが上限の値は含まれません。
C++のrand()はスレッドセーフですか?
rand() のスレッド安全性は実装依存です。スレッドごとにエンジンを用意するか、共有エンジンへのアクセスを同期してください。
C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution
参考資料・リソース
-
C++ <random> Reference - cppreference
C++の擬似乱数生成ライブラリに関する公式リファレンス。
-
Mersenne Twister - Wikipedia
多くの言語の乱数ライブラリで採用されているMersenne Twisterアルゴリズム。