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

参考資料・リソース