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 > 360 や pdf < 0 が成立することは理論上ありません。実際に出力されるのは、常に pdf * 0.1 / 360 の計算結果です。
この式では、乱数値を 0.1 倍して 360 で割ることで、確率密度として扱える小数値へ正規化しています。実行するたびに異なる値が表示されますが、出力は常に 0 以上 約 0.055 以下の範囲に収まります。乱数のシードを固定しないため、プログラムを実行するごとに結果は変わります。
-
C#で暗号学的に安全な乱数を生成する方法:RNGCryptoServiceProviderクラスの使い方
暗号学的に安全な乱数を生成するには、RNGCryptoServiceProviderクラスを使用します。このクラスはSystem.Security.Cryptography名前空間に属しており、暗号処理に対応した乱数ジェネレーター(CSPRNG)を実装しています。通常のRandomクラスとは異なり、予測が極めて困難な高品質な乱数を取得できるため、トークンやキーの生成など、セキュリティが求められる場面に適しています。以下は、このクラスを使ってランダムな値を取得する基本的なコード例です。using (RNGCryptoServiceProvider crypto = new RNGCryptoSe
-
Pythonで疑似乱数を生成する方法|randomモジュールの使い方を徹底解説
多くのコンピュータアプリケーションでは、乱数の生成が必要になります。しかし、コンピュータが生成できるのは「真の乱数」ではなく、あくまで規則性に基づいた疑似乱数です。 Pythonも他のプログラミング言語と同様に疑似乱数ジェネレーターを使用しており、その基盤となっているのは「メルセンヌ・ツイスタ(Mersenne Twister)」というアルゴリズムです。このアルゴリズムは53ビット精度の浮動小数点数を生成し、高速かつスレッドセーフであることが特徴ですが、暗号化用途には適していません。 Pythonの標準ライブラリには random モジュールが含まれており、乱数を扱うためのさまざまな関数が定義