C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で確率分布関数(PDF)を使って乱数を生成するプログラム

確率密度関数(PDF)とは

確率密度関数(Probability Density Function:pdf)とは、ある確率変数が特定の値をとる相対的な尤度(もっともらしさ)を表す関数です。連続型確率変数の「密度」とも呼ばれます。

確率変数がある値の範囲内に収まる確率は、その範囲における密度関数の積分によって求められます。これは図形的には、横軸より上・密度関数より下・範囲の最小値から最大値までの領域の面積に相当します。確率分布は、この確率密度関数をもとに構成されます。

アルゴリズム

開始
   変数 n を宣言する
   pdf = 0 を代入する
   i = 0 から n まで繰り返す:
      pdf = rand() mod 200
      もし pdf > 360 ならば
         1 を出力する
      そうでなければ もし pdf < 0 ならば
         0 を出力する
      それ以外の場合
         pdf * 0.1 / 360 を出力する
   繰り返し終了
終了

サンプルコード

#include <iostream>
using namespace std;
int n = 6;
int main(int argc, char **argv) {
    int pdf = 0;
    for (int i = 0; i < n; i++) {
        pdf = rand() % 200;
        if (pdf > 360)
            cout << 1 << " ";
        else if (pdf < 0)
            cout << 0 << " ";
        else
            cout << pdf * 0.1 / 360 << " ";
    }
    cout << "...";
}

実行結果

0.0508333 0.0238889 0.0491667 0.0319444 0.0536111 0.0375 ...

コードのポイント

rand() % 200 は 0〜199 の範囲の整数乱数を生成します。そのため、分岐条件の pdf > 360pdf < 0 が成立することは理論上ありません。実際に出力されるのは、常に pdf * 0.1 / 360 の計算結果です。

この式では、乱数値を 0.1 倍して 360 で割ることで、確率密度として扱える小数値へ正規化しています。実行するたびに異なる値が表示されますが、出力は常に 0 以上 約 0.055 以下の範囲に収まります。乱数のシードを固定しないため、プログラムを実行するごとに結果は変わります。

  1. C#で暗号学的に安全な乱数を生成する方法:RNGCryptoServiceProviderクラスの使い方

    暗号学的に安全な乱数を生成するには、RNGCryptoServiceProviderクラスを使用します。このクラスはSystem.Security.Cryptography名前空間に属しており、暗号処理に対応した乱数ジェネレーター(CSPRNG)を実装しています。通常のRandomクラスとは異なり、予測が極めて困難な高品質な乱数を取得できるため、トークンやキーの生成など、セキュリティが求められる場面に適しています。以下は、このクラスを使ってランダムな値を取得する基本的なコード例です。using (RNGCryptoServiceProvider crypto = new RNGCryptoSe

  2. Pythonで疑似乱数を生成する方法|randomモジュールの使い方を徹底解説

    多くのコンピュータアプリケーションでは、乱数の生成が必要になります。しかし、コンピュータが生成できるのは「真の乱数」ではなく、あくまで規則性に基づいた疑似乱数です。 Pythonも他のプログラミング言語と同様に疑似乱数ジェネレーターを使用しており、その基盤となっているのは「メルセンヌ・ツイスタ(Mersenne Twister)」というアルゴリズムです。このアルゴリズムは53ビット精度の浮動小数点数を生成し、高速かつスレッドセーフであることが特徴ですが、暗号化用途には適していません。 Pythonの標準ライブラリには random モジュールが含まれており、乱数を扱うためのさまざまな関数が定義