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;
}
こんなんでどうでしょう。