C#での確率分布に基づく乱数生成
二項分布の乱数生成
二項分布は、試行回数 n と成功確率 p に基づく離散確率分布です。
using System;
class Program
{
static Random rand = new Random();
static int Binomial(int n, double p)
{
int count = 0;
for (int i = 0; i < n; i++)
{
if (rand.NextDouble() < p)
count++;
}
return count;
}
static void Main()
{
Console.WriteLine(Binomial(10, 0.5));
}
}
ポワソン分布の乱数生成
ポワソン分布は、単位時間あたりの平均発生回数 λ に基づく離散確率分布です。
using System;
class Program
{
static Random rand = new Random();
static int Poisson(double lambda)
{
double L = Math.Exp(-lambda);
int k = 0;
double p = 1.0;
do {
k++;
p *= rand.NextDouble();
} while (p > L);
return k - 1;
}
static void Main()
{
Console.WriteLine(Poisson(4.0));
}
}
一様分布の乱数生成
一様分布は、指定された範囲 [a, b] の間で等確率に値を取る分布です。
using System;
class Program
{
static Random rand = new Random();
static double Uniform(double a, double b)
{
return a + (b - a) * rand.NextDouble();
}
static void Main()
{
Console.WriteLine(Uniform(0, 1));
}
}
正規分布の乱数生成
正規分布は、平均 μ と標準偏差 σ を持つ連続確率分布です。
using System;
class Program
{
static Random rand = new Random();
static double Normal(double mean, double stddev)
{
double u1 = 1.0 - rand.NextDouble();
double u2 = 1.0 - rand.NextDouble();
double z = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2);
return mean + stddev * z;
}
static void Main()
{
Console.WriteLine(Normal(0, 1));
}
}
t分布の乱数生成
t分布は、自由度 ν に依存する確率分布で、正規分布に類似しています。
using System;
using MathNet.Numerics.Distributions;
class Program
{
static void Main()
{
var tDist = new StudentT(0, 1, 10);
Console.WriteLine(tDist.Sample());
}
}
対数正規分布の乱数生成
対数正規分布は、変数の対数が正規分布に従う確率分布です。
using System;
using MathNet.Numerics.Distributions;
class Program
{
static void Main()
{
var logNormDist = new LogNormal(0, 1);
Console.WriteLine(logNormDist.Sample());
}
}