要求尽量高效,谢谢!

解决方案 »

  1.   

    i am also want to know.
      

  2.   

    分别用1~52表示52张各不相同的牌。
    typedef struct tagCardInfo
    {
    tagCardInfo(){bStatus=false;}
    int nValue;
    bool bStatus;
    } CardInfo;
    typedef CList<CardInfo,CardInfo&> CSelectedCardList;
    CSelectedCardList MySelectedCard;
    ...... 
      

  3.   

    rand((unsigned int)time(NULL));
    bool bFlag[52];//标志是否选过
    int iCard[20],t=0;//要选出的20张牌
    memset(bFlag,0,52*sizeof(bool));//初始化为全末选过
    do
    {
    iCard[t]=rand()%52;//随机取一个
    if (!bFlag[iCard[t]])//如果没有被选了
    {
    bFlag[iCard[t]]=true;//标志已选 
    t++;
    }
      if (t>=20) break;//选满20个,跳出
    }
    while(1)
      

  4.   

    注意:52个牌分别从标号0-51,简化一下rand((unsigned int)time(NULL));
    bool bFlag[52];//标志是否选过
    int iCard[20],t=0;//要选出的20张牌
    memset(bFlag,0,52*sizeof(bool));//初始化为全末选过
    while (1)
     {
      iCard[t]=rand()%52;//随机取一个
    if (!bFlag[iCard[t]])//如果没有被选了
         bFlag[iCard[t++]]=true;//标志已选 
      if (t>=20) break;//选满20个,跳出
    }
      

  5.   

    //52个牌分别从标号0-51char m_card[52];
    memset(m_card,0,sizeof(char));//清零
    srand( (unsigned)time( NULL ) );
    for (int i=0;i<20;i++)//只产生20个
    {
       if (m_card[i]==0) m_card[i] = i;//放当前牌号   int j = rand()%52;//随机取
       if (i!=j){
            if (m_card[j]==0) 
    m_card[j] = j; m_card[i] = j; 
    m_card[j] = i;//将取得牌坊当前
       }
    }  //m_card[]的0~19为所求
      

  6.   

    如果这些东东都记录在表中,一条SELECT就行了
      

  7.   

    char* b[4][13]={};          //4*13字符串
    char* result[20]={};
    char* select(int& i,int& j)
    {
    srand(time( NULL));
    i=rand()%4;
    j=rand()%13;
    return b[i][j];
    }
    结果存入result前判断,有无相同结果..