ベキ分布

ベキ分布乱数という単語が存在するかはわからないが,任意の確率密度関数に従った乱数をほしいと思うことはある.今回は,ベキ分布に従った乱数を生成する関数がないかと探したが見当たらなかったので,なんとなく作成した.それっぽいデータは生成できるが,正確とは限らないのであしからず.

ガウス分布の用に計算で出力できたら良いのだが,アルゴリズムは見つからない.

Java プログラム

ベキ分布を生成

指数ベキ分布の密度関数はめんどくさそうなので,Zipf-Mandelbrot lawに従う密度分布を以下の関数で作成.


    public static double powerlaw(double x, int N, double q, double s) {
	double h = 0;
	for(int i = 1; i <= N; i++) {
	    h += 1/Math.pow(i + q, s);
	}
	return (1/Math.pow(x + q, s))/h;
    }		   
    public static double[] powerlaw_distribution(int k, int N, double q, double s) {
	double[] p = new double[k+1];
	for(int i = 1; i <= k; i++) {
	    p[i] = powerlaw(i, N, q, s);
	}
	return p;
    }
	       

適当な,確率密度関数に従って乱数を発生させる関数.


    public static int sample(double k, double[] p) {
	double total = 0;
	int j = 0;	
	while(k >= total) {
	    if(p.length <= j + 1)
		break;
	    total += p[++j];
	}
	return j;
    }
	       

なお,Zipf-Mandelbrot law に関する詳細は分かっていないので,勉強が必要.q は,ベキの指数を示しているっぽいが,s が何なのかさっぱり.

参考ページ