単純な分布に従った単一の乱数が欲しい

概要

比較的単純な分布に従う単一の乱数を得る時に必要な技術について紹介します.幾何分布等有名どころのみ紹介します.
Facebookシェア Twitterツイート LINEで送る このエントリーをはてなブックマークに追加
この章を学ぶ前に必要な知識
0
条件
  • 分布によって入力になるパラメータは様々
  • 一様乱数を生成する関数が必要
効果
  • 分布に従った単一の乱数を得る

解 説

単純な分布に従う単一の乱数を生成する方法についてまとめています. ここで紹介する乱数が従う確率分布は ・幾何分布 ・三角分布 ・べき乗分布 ・ワイブル分布 ・ロジスティック分布 ・ポアソン分布 になります.
単純な分布に従った単一の乱数が欲しい

1.幾何分布

幾何分布は確率pでコインの表が出る時に、n回目で初めて表の出る確率. 単純に0~1の擬似乱数を生成して、while文でその値がpを超えるまでの回数を返す方法があります.しかし、可能性は低いですが、それでは実行によって大きく処理時間が異なります.そこで別の方法で近似する方法があります.
幾何分布に従う乱数生成
C++
1
2
3
double geo_random(double p ){
     return ceil(log(rand())/log(1-p));
}
幾何分布に従う近似 0以上の整数を幾何分布に従う乱数として得られます. 注意点としてこのときに擬似乱数生成関数rand()の値は0より大きいことが前提です.(logにいれるので)

2.三角分布

三角分布は最小値aと最大値bと最頻値cを用いて定義される確率密度分布によって定義される確率分布. 例えばaを-1としbを1としcを0とした分布は、平均0分散1/6としてシンメトリな分布になる.
三角分布に従う乱数について
C++
1
2
3
4
5
6
7
8
9
//三角分布に従う乱数
double tri_rand(double a, double b, double c)
{
    if (x <= (c-a)/(b-a)){
        return a+sqrt( (c-a) * (b-a) * x);
    }else{
        return b-sqrt((b-c) * (b-c) - (b-c) * (b-a) * (x - (c-a) / (b-a) ) );
    }
}
三角分布に従う乱数 元の三角分布の密度関数を積分し、逆関数を解くことで導かれる.

3.べき乗分布

極端な値などを取り得るデータにおいて適切なべき乗分布の乱数を得る.
べき乗分布に従う乱数について
C++
1
2
3
double pow_rand(int n){
    return pow(rand(), 1.0 / ( n + 1 ));
}
べき乗分布に従う乱数を生成する関数 nはべき乗分布のパラメータ

4.ワイブル分布

は物体の強度の変化、壊れる確率の推移を表現するのに使用される確率分布.
ワイブル分布に従う乱数について
C++
1
2
3
double wei_rand(double alpha){
    return pow(-log(rand()), 1.0/alpha);
}
ワイブル分布に従う乱数を生成する関数 rand()は0より大きく1より小さい数を生成する.

5.ロジスティック分布

ロジスティック分布は正規分布より裾のの広い確率分布. 分布関数の逆関数より一様乱数を生成する.
ロジスティック分布に従う乱数について
C++
1
2
3
4
double logi_rand(){
    double rand_val = rand();
    return log(rand_val / (1 - rand_val));
}
ロジスティック分布に従う乱数生成の関数

6.ポアソン分布

単位時間当たりにλ回平均して起こる事象を表す確率分布. 以下の関数によって実際に起こった回数kを乱数として算出する. rand()は0 より大きく1より小さい.
ポアソン分布
C++
1
2
3
4
5
6
7
8
9
double poi_rand(double lambda){
    int k = 0;
    lambda = exp(-lambda);
    while(lambda > 1){
        lambda *= rand();
        k++;
    }
    return k;
}
ポイソン分布に従う乱数生成の関数
この章を学んで新たに学べる
Comments

Reasons
>>隠す