分布
乱数の出力特性を整えます
「分布」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
分布の役割
分布は、エンジンの生のビットを、目的の形と範囲を持つ値に変換します。エンジンを引数として渡して呼び出します。
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(1);
std::uniform_int_distribution<int> dist(1, 100);
std::cout << "value: " << dist(gen) << '\n';
return 0;
}一様整数分布
std::uniform_int_distribution<int>(a, b)は、[a, b]の両端を含む範囲の整数を返します。それぞれの整数が同じ確率で選ばれます。
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(5);
std::uniform_int_distribution<int> die(1, 6);
for (int i = 0; i < 5; ++i) std::cout << die(gen) << ' ';
std::cout << '\n';
return 0;
}一様実数分布
std::uniform_real_distribution<double>(a, b)は、[a, b)の範囲の浮動小数点値を返します。確率の生成などに便利です。
#include <iostream>
#include <random>
#include <iomanip>
int main() {
std::mt19937 gen(3);
std::uniform_real_distribution<double> dist(0.0, 1.0);
std::cout << std::fixed << std::setprecision(3) << dist(gen) << '\n';
return 0;
}ベルヌーイ分布
std::bernoulli_distribution(p)は、確率pでtrueを返し、偏ったコイン投げをモデル化します。
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(8);
std::bernoulli_distribution coin(0.5);
for (int i = 0; i < 5; ++i) std::cout << (coin(gen) ? 'H' : 'T');
std::cout << '\n';
return 0;
}正規分布
std::normal_distribution<double>(mean, stddev)は、平均の周辺に集中する釣鐘型の曲線を生成します。
#include <iostream>
#include <random>
#include <iomanip>
int main() {
std::mt19937 gen(11);
std::normal_distribution<double> dist(100.0, 15.0);
std::cout << std::fixed << std::setprecision(1) << dist(gen) << '\n';
return 0;
}分布を再利用する
分布は繰り返し呼び出しても負荷が小さいものです。1つ作成し、同じエンジンを使ってループ内で呼び出してください。
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(20);
std::uniform_int_distribution<int> d(1, 3);
int counts[4] = {0};
for (int i = 0; i < 12; ++i) counts[d(gen)]++;
std::cout << counts[1] << ' ' << counts[2] << ' ' << counts[3] << '\n';
return 0;
}ポアソン分布
std::poisson_distribution<int>(mean)は、1分あたりの到着数のような、まれに発生する事象の回数をモデル化します。
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(30);
std::poisson_distribution<int> dist(4.0);
for (int i = 0; i < 5; ++i) std::cout << dist(gen) << ' ';
std::cout << '\n';
return 0;
}分布のパラメーター
分布のパラメーターは、a()、b()、mean()、stddev()などのアクセサーで取得できます。
#include <iostream>
#include <random>
int main() {
std::uniform_int_distribution<int> d(10, 50);
std::cout << "range: " << d.a() << " to " << d.b() << '\n';
return 0;
}分布の状態をリセット
一部の分布(normalなど)は内部状態をキャッシュします。reset()でその状態を消去すると、次の値はエンジンだけに依存するようになります。
#include <iostream>
#include <random>
int main() {
std::mt19937 gen(40);
std::normal_distribution<double> dist(0.0, 1.0);
dist(gen);
dist.reset();
std::cout << "distribution state reset\n";
return 0;
}ランダムな要素の選択
配列のインデックスをランダムに選ぶには、0からsize - 1までを対象とするuniform_int_distributionを使用します。
#include <iostream>
#include <random>
#include <string>
int main() {
std::string colors[] = {"red", "green", "blue"};
std::mt19937 gen(50);
std::uniform_int_distribution<int> pick(0, 2);
std::cout << colors[pick(gen)] << '\n';
return 0;
}円周率の推定
分布はモンテカルロ法を支えます。正方形の中からランダムな点をサンプリングすると、円周率を推定できます。
#include <iostream>
#include <random>
#include <iomanip>
int main() {
std::mt19937 gen(60);
std::uniform_real_distribution<double> u(0.0, 1.0);
int inside = 0, n = 10000;
for (int i = 0; i < n; ++i) {
double x = u(gen), y = u(gen);
if (x * x + y * y <= 1.0) ++inside;
}
std::cout << std::fixed << std::setprecision(2) << 4.0 * inside / n << '\n';
return 0;
}理解度チェック
分布の範囲についての理解度を確認します。
まとめ
分布について学びました。
- 分布はエンジンの出力を形作ります:
uniform_int(両端を含む)、uniform_real([a,b))、bernoulli、normal、poisson - エンジンとともに呼び出します(例:
dist(gen))。ループ内で再利用することもできます - 要素の選択やモンテカルロ推定に利用できます
次は、エンジンに適切なシードを設定します。
AI チューターと学ぶ C++ — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「分布」レッスンは無料ですか?
はい。「分布」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「分布」で何を学びますか?
乱数の出力特性を整えます ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「分布」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。