## Thursday, 25 August 2016

### Chapter 7 Exercise 24, Introduction to Java Programming, Tenth Edition Y. Daniel LiangY.

**7.24 (Simulation: coupon collector’s problem) Coupon collector is a classic statistics problem with many practical applications. The problem is to pick objects from a set of objects repeatedly and find out how many picks are needed for all the objects to be picked at least once. A variation of the problem is to pick cards from a shuffled deck of 52 cards repeatedly and find out how many picks are needed before you see one of each suit. Assume a picked card is placed back in the deck before picking another. Write a program to simulate the number of picks needed to get four cards from each suit and display the four cards picked (it is possible a card may be picked twice).
Here is a sample run of the program:

5 of Clubs
Queen of Hearts
4 of Diamonds
Number of picks: 12

public class ProgrammingEx7_24 {
// Approach: Pick card at ramdom and check for suit then record if a suit
// has been picked up. Keep doing that until all suits are picked up .

public static void main(String[] args) {

int mask = 0b1111, picked = 0b0000;
int numberOfPick = 0;
int card = pickCard();
String suit = getSuit(card);
int temp = picked;
switch (suit) {
case "Clubs":
picked |= 0b1000;
break;
case "Diamonds":
picked |= 0b0100;
break;
case "Hearts":
picked |= 0b0010;
break;
picked |= 0b0001;
break;
}

String rank = getRank(card);

if (temp != picked) {
System.out.println(rank + " of " + suit);
}
numberOfPick++;

}

System.out.println("Number of picks:" + numberOfPick);
}

public static int pickCard() {
int card = (int) (Math.random() * 52.0); // pick a card 0-51
return card;
}

public static String getRank(int card) {

int rank = card / 4; // determine the rank 0-12

String strRank = "";

switch (rank) {
case 0:
strRank = "Ace";
break;
case 10:
strRank = "Jack";
break;
case 11:
strRank = "Queen";
break;
case 12:
strRank = "King";
break;
default:
strRank = "" + (rank + 1);
break;
}

return strRank;

}

public static String getSuit(int card) {

int suit = card % 4; // determine the suit 0-3
String strSuit = "";

switch (suit) {
case 0:
strSuit = "Clubs";
break;
case 1:
strSuit = "Diamonds";
break;
case 2:
strSuit = "Hearts";
break;
case 3: