145k views
4 votes
Coupon collector is a classic statistic problem with many practical applications. The problem is to pick objects from a set of objects repeatedly and determine 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 total of four cards from each different suit and display the four cards picked (it is possible that a card may be picked twice). Here is a sample run of the program:

4 of Diamonds
8 of Spades
Queen of Clubs
8 of Hearts
Number of picks: 9

1 Answer

2 votes

Answer:

Here is the JAVA program:

public class Main { //class name

public static void main(String[] args) { //start of main method

//sets all boolean type variables spades, hearts diamonds and clubs to false initially

boolean spades = false;

boolean hearts = false;

boolean diamonds = false;

boolean clubs = false;

String[] deck = new String[4]; //to store card sequence

int index = 0; //to store index position

int NoOfPicks = 0; //to store number of picks (picks count)

while (!spades || !hearts || !diamonds || !clubs) { //loop starts

String card = printCard(getRandomCard()); //calls printCard method by passing getRandomCard method as argument to it to get the card

NoOfPicks++; //adds 1 to pick count

if (card.contains("Spades") && !spades) { //if that random card is a card of Spades and spades is not false

deck[index++] = card; //add that card to the index position of deck

spades = true; //sets spades to true

} else if (card.contains("Hearts") && !hearts) { //if that random card is a card of Hearts and hearts is not false

deck[index++] = card;

hearts = true; //sets hearts to true

} else if (card.contains("Diamond") && !diamonds) { //if that random card is a card of Diamond and diamonds is not false

deck[index++] = card;

diamonds = true; //sets diamonds to true

} else if (card.contains("Clubs") && !clubs) { if that random card is a card of Clubs and clubs is not false

deck[index++] = card;

clubs = true; } } //sets clubs to true

for (int i = 0; i < deck.length; i++) { //iterates through the deck i.e. card sequence array

System.out.println(deck[i]); } //prints the card number in deck

System.out.println("Number of picks: " + NoOfPicks); } //prints number of picks

public static int getRandomCard() { //gets random card

return (int) (Math.random() * 52); } //generates random numbers of 52 range

public static String printCard(int cardNo) { //displays rank number and suit

String[] suits = { "Spades", "Hearts", "Diamonds", "Clubs", }; //array of suits

String[] rankCards = { "Ace", "2", "3", "4", "5", "6", "7", "8", "9", "10",

"Jack", "Queen", "King" }; //array of rank

int suitNo = cardNo / 13; //divides card number by 13 and stores to suitNo

int rankNo = cardNo % 13; //takes modulo of card number and 13 and store it to rankNo

return rankCards[rankNo] + " of " + suits[suitNo]; }} //returns rankCard at rankNo index and suits at suitNo index

Step-by-step explanation:

The program is explained in the comments attached with each line of code. The screenshot of the program along with its output is attached.

Coupon collector is a classic statistic problem with many practical applications. The-example-1
User GreySage
by
5.0k points