randomヘッダーで乱数を扱う
最新の乱数エンジンと分布を使って、品質の高い乱数を生成します。
「randomヘッダーで乱数を扱う」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
rand() を使わない理由
レガシーな C の std::rand() はグローバル状態を使用し、統計的な品質も低く、スレッドセーフではありません。モダン C++ では、<random> によりはるかに優れたツールが提供されています。
3つの要素で構成する方法
モダン C++ の乱数生成には、次の3つの要素が関係します。
- シードソース(真のエントロピー)
- 生成エンジン(決定論的な状態)
- 分布(出力の形を決めるもの)
random_device によるシード設定
std::random_device は OS から実際のエントロピーを取得しますが、時間がかかる場合があります。これを一度だけ使用して、高速なエンジンのシードを設定してください。
#include <random>
std::random_device rd;
std::mt19937 engine(rd());mt19937 エンジン
std::mt19937(メルセンヌ・ツイスタ)は、統計的な品質に優れた高速な疑似乱数エンジンです。ほとんどの用途でデフォルトの選択肢になります。
一様整数分布
閉区間内の整数を一様分布に従って生成します。
std::uniform_int_distribution<int> dice(1, 6);
int roll = dice(engine);一様実数分布
半開区間 [a, b) 内の浮動小数点数を生成する場合に使用します。
std::uniform_real_distribution<double> dist(0.0, 1.0);
double x = dist(engine);正規分布(ガウス分布)
ベルカーブ状に分布する乱数を生成します。シミュレーションや機械学習でよく使用されます。
std::normal_distribution<double> norm(0.0, 1.0); // mean 0, stddev 1
double x = norm(engine);その他の分布
ライブラリには、bernoulli_distribution、poisson_distribution、exponential_distribution、discrete_distribution など、さらに多くの分布が含まれています。
再現可能な乱数
テストでは固定値をシードにすると、実行するたびに同じ系列を取得できます。
std::mt19937 engine(42);
// Same output every time you run the program乱数によるシャッフル
std::shuffle を使うとコンテナをシャッフルできます。任意のエンジンを渡せます。
#include <algorithm>
std::vector<int> v = {1,2,3,4,5};
std::shuffle(v.begin(), v.end(), engine);落とし穴: ループ内での再シード
乱数を1つ生成するたびに新しい random_device やエンジンを作成しないでください。エンジンを1つ構築し、呼び出しの間で再利用してください。
理解度チェック
疑似乱数エンジンにシードを設定する、モダン C++ で最も安全な方法は何ですか。
まとめ
モダン C++ の乱数生成では、シード設定に random_device、エンジンに mt19937、出力の形を決める分布に uniform_int_distribution のような分布を使用します。エンジンは再利用し、呼び出しごとに作成しないでください。
よくある質問
「randomヘッダーで乱数を扱う」レッスンは無料ですか?
はい。「randomヘッダーで乱数を扱う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「randomヘッダーで乱数を扱う」で何を学びますか?
最新の乱数エンジンと分布を使って、品質の高い乱数を生成します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「randomヘッダーで乱数を扱う」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 整数型と浮動小数点型
- cmathヘッダー:pow、sqrt、abs、round
- randomヘッダーで乱数を扱う
- 数値の上限とオーバーフローの動作