110 likes | 218 Views
Discover the mathematics behind coupon collection, from determining balls falling into bins to finding expected tosses per bin. Dive deep into probabilities and stages to find solutions to this intriguing problem.
E N D
Coupon collector’s problem CS658 Po-Ching Liu
Question • A person trying to collect each of b different coupons must acquire approximately x randomly obtained coupons in order to succeed. • find x
Balls and bins • 1st question: If n identical balls are tossed randomly into b bins, thenhow many balls willfall in a given bin? • Ans:
Second • Second question: Find the expected number of balls we need to toss (one ball for each toss) until a given bin contains a ball. The number of bins = b • Ans: E = b
proof • p=pro(success) = 1/b=1-q • q=pro(withoutsuccess)=1-1/b=1- p • E[# of tosses until a given bin contains a ball]
Third • the third question: Find the expected number of balls we need to toss (one ball for each toss) until every bin contains at least one ball? The number of bins = b • Ans: E = b(lnb+O(1))
proof • There are b stages • The ith stage consists of the tosses after the (i-1)th hit until the ith hit. • how many balls do we have to toss in order to move from the (i-1) th stage to the ith stage there are (i-1) bins that contain balls and b-(i-1) empty bins. for each toss in the ith stage, the probability of obtaining a hit is (b-i+1)/b.
proof • E[# of tosses in the ith stage]= • E[total # of tosses in the 1st to the bth stage] =
proof • We find the two following questions are the same: • Q:Find the expected number x of balls we need to toss (one ball for each toss) until every bin contains at least one ball? The number of bins = b • Q: A person trying to collect each of b different coupons must acquire approximately x randomly obtained coupons in order to succeed.
Code by java compile: javac CouponCollector.java Run: java CouponCollector • public class CouponCollector { • public static void main(String[] args) { • int N = 50; // number of different card types • boolean[] found = new boolean[N]; • // found[i] = true ==> if card i has been collected , false ==> the new type of card • intcardcnt = 0; • // total number of cards collected • intvalcnt = 0; • // number of distinct cards • // repeatedly choose a random card and check whether it's a new one • while (valcnt < N) { • intval = (int) (Math.random() * N); • // random card between 0 and N-1 • cardcnt++; • // we collected one more card ==>total number +1 • 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); • } • }
references • Thomas H. Cormen,Charles E. Leiserson, Ronald L. Rivest, Clifford Stein(1990), Introduction to Algorithms, The MIT Press, Cambridge, Massachusetts London, England, pp. 109-110. • http://www-stat.stanford.edu/~susan/surprise/Collector.html