0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 整数型と浮動小数点型
  2. cmathヘッダー:pow、sqrt、abs、round
  3. randomヘッダーで乱数を扱う
  4. 数値の上限とオーバーフローの動作
← C++ Academyに戻る