java初心者です。javaで二項分布に従う乱数を生成

Writer: admin Type: booksonline Date: 2019-03-06 00:00
java初心者です。javaで二項分布に従う乱数を生成したいのですが、二項分布の確率分布のクラスは作れたのですが、そこから乱数生成ができません。一応こんな風にコードを書いているのですが、二項分布に従う乱数が生成できず止まってます。package sample_txt;//二項分布クラスclass binomial{ // p ;//事象が生じる確率 // n; //試行回数 // k; //試行回数中に事象が生じる回数 double combine(int n, int k){ double c = 1.0, x = 1.0, y = 1.0; int i1; if (k > 0) { if (k > n-k) k = n - k; for (i1 = n; i1 >= n-k+1; i1--) x *= i1;//分子 for (i1 = 2; i1 <= k; i1++) y *= i1;//分母(階乗計算) c = x / y; } return c; } double binomial_random(double p, int n, int k){ return combine(n,k)*Math.pow(p, k)*Math.pow(1-p, n-k); } }public class sample_txt{ public static void main(String[] args) { int n=40; int k=15; double p=0.4; binomial random_b = new binomial(); double c = random_b.combine(n,k); double binom_r = random_b.binomial_random(p, n, k); System.out.println(binom_r); }}共感した0###binomial_random()はB(n, p)に従う確率変数kの確率を求めているメソッドでしょうか?二項分布に従う乱数を作るには、分布は不要ですよ。乱数は二項分布の定義通りに作っていけば良いです。つまり0~1の一様乱数(Math.random()とか)を作り確率pより大きいかを評価するこれで、ベルヌーイ分布に従う乱数が得られますね。二項分布は、ベルヌーイ分布に従う独立な確率変数をn個集めた和となるので上記をn回繰り返し和を求めれば、二項分布の乱数が得られます実装例:static int rand_bin(int n, double p) {return (int)// 乱数ジェネレータ取得java.util.concurrent.ThreadLocalRandom.current()// 0~1の一様乱数をn個取得.doubles(n)// p以上の乱数値をカウント.filter(d -> p < d).count();}#この関数の戻り値が二項分布B(n, p)に従う乱数になります。添付図は、上記メソッドをB(10, 0.5)の設定で、200回取得しヒストグラムにしたもの二項分布の確率分布になっていることがわかる※「同一分布と言えるのか」の検定はしていませんが。。###この回答は投票によってベストアンサーに選ばれました!

 

TAG