C#での確率分布に基づく乱数生成

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());
    }
}
    

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です