优惠券收集人问题

Posted Western_Trail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优惠券收集人问题相关的知识,希望对你有一定的参考价值。

问题描述:

它是一个经典的统计问题,有很多实际应用。这个问题从一套对象中拿出一个对象,然后找到要将所有需要拿的对象都至少拿出来一次,需要拿多少次。为了叙述方便,以扑克牌为例。一副打乱的52张扑克牌,找出在看到每种花色都有一张出现前,需要选多少次。编写程序,模拟要得到四张不同花色的牌所需要的选取次数,然后显示选中的四张牌(有可能一张牌被选了两次)。

解题思路:

要解决这个问题首先要解决以下几个子问题:

  • 怎样模拟一副牌出来
  • 怎样将牌打乱(也就是俗称的洗牌)
  • 怎么模拟无限摸牌
  • 无限摸牌退出的条件是什么?

这里我们这里我们使用了一个boolean型的数组存储每个花色是否出现过,出现了就设为true。

源码如下:

public class demo1{
    public static void main(String[] args){
        boolean[] huase = new boolean[4];   //存放每种花色的抽取情况 
        boolean flag = false;
        int count = 0;
        //因为并不知道要抽多少次,所以要放在一个无限循环中 
        while(flag == false){       
            if(huase[0]&&huase[1]&&huase[2]&&huase[3])  //若四种花色都出现过 
                flag = true;
            else{
                switch(choosePai(huase)){
                    case "Spades":
                        huase[0] = true;
                        break;
                    case "Hearts":
                        huase[1] = true;
                        break;
                    case "Diammonds":
                        huase[2] = true;
                        break;
                    case "Clubs":
                        huase[3] = true;
                        break;
                }
            }
            count++;
        }
        System.out.println("Number of picks:"+count); 
    }
    
    public static String choosePai(boolean[] huase){
        int[] deck = new int[52];   //用来存放52张牌 
        String[] Huases = {"Spades","Hearts","Diamonds","Clubs"};
        String[] ranks = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"};
        
        //首先初始化牌组
        for(int i = 0;i < deck.length;i++){
            deck[i] = i;
        } 
        
        //进行洗牌
        for(int i = 0;i < deck.length;i++){
            int Index = (int)(Math.random()*deck.length);
            int temp = deck[i];
            deck[i] = deck[Index];
            deck[Index] = temp;
        }
        
        //从52张牌中任选一张进行抽牌
        int i = (int)(Math.random()*deck.length);
        String Huase = Huases[deck[i] / 13];
        String rank = ranks[deck[i]%13];
        switch(Huase){
        case "Spades":  
            if(!huase[0])  
                {System.out.println(rank+" of "+Huase);huase[0] = true;}  
            break;  
        case "Hearts":  
            if(!huase[1])  
                {System.out.println(rank+" of "+Huase);huase[1] = true;}  
            break;  
        case "Diamonds":  
            if(!huase[2])  
                {System.out.println(rank+" of "+Huase);huase[2] = true;}  
            break;  
        case "Clubs":  
            if(!huase[3])  
                {System.out.println(rank+" of "+Huase);huase[3] = true;}  
            break;  
        } 
        return Huase;
    }
}

以上是关于优惠券收集人问题的主要内容,如果未能解决你的问题,请参考以下文章

Algs4-1.4.45优惠券收集问题

Microsoft SQL Server 代码片段收集

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解

优惠券模拟收集(Couponcollector)

精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!(转载)

小溪边腾讯云服务器2折优惠