C++ Academy · レッスン

分布

乱数の出力特性を整えます

レッスン 2/413 ステップ

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

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

  1. 乱数エンジン
  2. 分布
  3. 適切なシード設定
  4. 実践例
← C++ Academyに戻る