import java.util.*; interface Function { public T call(S x); } public class AlgorithmS { private static final Random rand = new Random(); public static Function> s_of_n_creator(final int n) { return new Function>() { private List sample = new ArrayList(n); private int i = 0; public List call(T item) { if (++i <= n) { sample.add(item); } else if (rand.nextInt(i) < n) { sample.set(rand.nextInt(n), item); } return sample; } }; } public static void main(String[] args) { int[] bin = new int[10]; for (int trial = 0; trial < 100000; trial++) { Function> s_of_n = s_of_n_creator(3); for (int i = 0; i < 9; i++) s_of_n.call(i); for (int s : s_of_n.call(9)) bin[s]++; } System.out.println(Arrays.toString(bin)); } }