犀角(Diceros Horn)

とくながの「書き散らかし」です

ここは研究・調査・開発などの記録がメインのページです。 日常の雑事、読書記録は はてなダイアリー の方に書いています。よろしければそちらもどうぞ。

Fri, 23 Dec 2005

n個の中からk個を取り出す乱数

高校数学などでよく出てくる問題をシミュレーションするために。 n個の配列をシャッフルして先頭からk個を取り出してもいいんだけど、 無駄が多いかな。1回めはn個の中からひとつ取り出し、2回目はそれを除いた n-1個の中からひとつ取り出し・・・・ということをk回繰り返してもいいんだけど。

ここで挙げるのは乱数の生成が1回で済む方法。

    public int[] generate(int n,int k){
	int result[] = new int[k];
	double p = Math.random();
	int on = k;
	int off = n-k;
	for(int i=0;i<n;i++){
	    p *= (on+off);
	    if(p < on){
		result[k-on] = i;
		p /= on;
		on--;
	    }else{
		p -= on;
		p /= off;
		off--;
	    }
	}
	return result;
    }
こんなんでどうでしょう。

posted at 20:15 | category: /Java/algorithm | 固定リンク(n個の中からk個を取り出す乱数 )