challenge n人中m人が当選するくじ

n人の中から公平にm人を選ぶ、くじ引きプログラムを作ってください。

Posted feedbacks - Java

適当
1
2
3
4
5
6
public boolean hoge(int n, int m) {
    if ( n < m || n < 0 || m < 0 ) throw new IllegalArgumentException();

    long seed = new java.util.Date().getTime() % n;
    return seed < m;
}

ああ、問題読み間違え。 かならずm人が当たる必要あり。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
	public boolean[] lot(int n, int m) {
	    if ( n < m || n < 0 || m < 0 ) throw new IllegalArgumentException();
	    boolean[] result = new boolean[n];
	    for ( int i = 0; i < n; i++ ) result[i] = i < m;
	    for ( int i = 0; i < n; i++) {
	    	int rnd = (int)(Math.random() * 100) % n;
    		boolean tmp = result[i];
    		result[i] = result[rnd];
    		result[rnd] = tmp;
	    }
	    return result;
	}

選ばれた人を消去して重複回避。不細工だなぁ。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class LotGame {

    public List<Integer> lot(int n, int m) {
        List<Integer> result = new ArrayList<Integer>();
        List<Integer> base = range(n);
        Random random = new Random();
        for (int i = 0; i < m; i++) {
            int j = random.nextInt(base.size() - 1);
            result.add(base.get(j));
            base.remove(j);
        }
        return result;
    }

    private List<Integer> range(int n) {
        List<Integer> result = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            result.add(i);
        }
        return result;
    }

    public static void main(String[] args) {
        for (int i : new LotGame().lot(10, 5)) {
            System.out.println(i);
        }
    }
}

Index

Feed

Other

Link

Pathtraq

loading...