/************************************************************************* * Compilation: javac CouponCollector.java * Execution: java CouponCollector N * * Given N distinct card types, how many random cards do you need * do collect before you have (at least) one of each type? * This program simulates this random process. * * * % java CouponCollector 1000 * 6583 * * % java CouponCollector 1000 * 6477 * * % java CouponCollector 1000000 * 12782673 * *************************************************************************/ public class CouponCollector { public static void main(String[] args) { int N = Integer.parseInt(args[0]); // number of card types boolean[] found = new boolean[N]; // found[i] = true if card i has been collected int cardcnt = 0; // total number of cards collected int valcnt = 0; // number of distinct cards // repeatedly choose a random card and check whether it's a new one while (valcnt < N) { int val = (int) (Math.random() * N); // random card between 0 and N-1 cardcnt++; // we collected one more card if (!found[val]) valcnt++; // it's a new card type found[val] = true; // update found[] } // print the total number of cards collected System.out.println(cardcnt); } }