回 帖 发 新 帖 刷新版面

主题:为何这个契约棋牌中的随机数分配有重复

请各位高手帮我看看这个程序为何输出结果在1至52之间有重复啊
    #include<stdio.h>
#include<stdlib.h>
#include<time.h>
void sortary(int oary[]);
void giveary(int ary[],int ary1[],int ary2[],int ary3[],int ary4[]);
void printary(int oary[]);
int main (void)
{
    int ary[52];
    int ary1[13];
    int ary2[13];
    int ary3[13];
    int ary4[13];
    int i;
  srand((unsigned)time(NULL));
  for(i=0;i<52;i++)
    ary[i]=rand()%52+1;
giveary(ary,ary1,ary2,ary3,ary4);
sortary(ary1);
sortary(ary2);
sortary(ary3);
sortary(ary4);
printf("\nNORTH\n");
printary(ary1);
printf("\nEAST\n");
printary(ary2);
printf("\nSOUTH\n");
printary(ary3);
printf("\nWEST\n");
printary(ary4);
return 0;
}


void giveary(int ary[],int ary1[],int ary2[],int ary3[],int ary4[])
{
    int i;
    int m;
    for(i=0;i<13;i++)
        ary1[i]=ary[i];
    for(i=13;i<26;i++)
    {
        m=i-13;
        ary2[m]=ary[i];
    }
    for(i=26;i<39;i++)
    {
        m=i-26;
        ary3[m]=ary[i];
    }
    for(i=39;i<52;i++)
    {
        m=i-39;
        ary4[m]=ary[i];
    }
    return;
}

void sortary(int oary[])
{
    int i;
    int current;
    int temp;
    int smallest;
    for(smallest=0;smallest<12;smallest++)
        for(current=smallest+1;current<13;current++)
            if(oary[current]<oary[smallest])
            {
                temp=oary[current];
                oary[current]=oary[smallest];
                oary[smallest]=temp;
            }
            return;
}

void printary(int oary[])
{
    int i;
    for(i=0;i<13;i++)
        printf("%3d",oary[i]);
    printf("\n");
    return;
}

回复列表 (共7个回复)

沙发

void sortary(int oary[])
{
    int i;//下面都没用到。
    int current;
    int temp;
    int smallest;
    for(smallest=0;smallest<12;smallest++)
        for(current=smallest+1;current<13;current++)
            if(oary[current]<oary[smallest])
            {
                temp=oary[current];
                oary[current]=oary[smallest];
                oary[smallest]=temp;
            }
            return;
}
首先你是用随机数填充ary[52]数组,里面就有很多重复的,当你分配的时候自然也有重复的。
ary[i]=rand()%52+1;就是得到1到52之间的数,数组大小又只有52,用如下方法就行:
    int ary[52];
    int ary1[13];
    int ary2[13];
    int ary3[13];
    int ary4[13];
    int i;

  for(i=0;i<52;i++)
  {
    ary[i] = i + 1;
  }

板凳


但是我需要的是将1至52这52个数分配到这些数组中    不能有重复   请帮我想想算法   谢谢

3 楼

int ary1[13];
 int ary2[13];
 int ary3[13];
 int ary4[13];

你的意思是这四个数组都可以1~52吗?但是不能出现重复?

4 楼


嗯     这是一个契约棋牌游戏分牌的程序  不能有重复    谢谢

5 楼

srand((unsigned)time(NULL));
    for(i=0; i <52; i++)
    {
        ary[i] = rand() % 52 + 1;
        for(j=0; j<i; j++)
        {
            while(ary[i] == ary[j])
            {
                ary[i] = rand() % 52 + 1;
                j = -1;
            }
        }
    }
//以上算法实现了ary[52]数组中,52张牌位置随机,而且数值是1到52,没有重复
你的意思是这四个数组都可以1~52吗?但是不能出现重复?我对自己的这句话产生了怀疑,估计你也是理解错了。难道是四副牌?呵呵。估计我理解力不好。

6 楼


是一副牌分成四份     每份的牌不相同    合起来就是52张不同的牌




我自己写了这个程序

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void printary(int oary[]);
int main (void)
{
    int ary[52];
    int ary1[13];
    int ary2[13];
    int ary3[13];
    int ary4[13];
    int i;
    int p=0;
    int q=0;
    int r=0;
    int s=0;
    int m;
    srand((unsigned)time(NULL));
  for(i=0;i<52;i++)
  {
  ary[i]=i+1;
  }
  for(i=0;i<52;i++)
  {
     m=(rand()%52+1)%4;
     switch(m)
    {
       case 0:  p++;
            if(p<=12)
              ary1[p]=i;
             else
              if(q<12)
               {
                 q++;
                 ary2[q]=i;
               }
               else
                if(r<12)
                 {
                   r++;
                   ary3[r]=i;
                   }
                   else
                   ary4[12]=i;
           break;
      case 1: q++;
           if(q<=12)
             ary2[q]=i;
           else
             if(r<12)
             {
               r++;
               ary3[r]=i;
               }
              else
              if(s<12)
              {
                s++;
                ary4[s]=i;
                }
                else
                ary1[12]=i;
     break;
     case 2:  r++;
              if(r<=12)
              ary3[r]=i;
              else
                if(s<12)
                 {
                  s++;
                  ary4[s]=i;
                  }
                  else
                  if(p<12)
                  {
                    p++;
                    ary1[p]=i;
                    }
                    else
                    ary2[12]=i;
          break;
       case 3: s++;
                 if(s<=12)
                 ary4[s]=i;
                 else
                   if(p<12)
                   {
                    p++;
                    ary1[p]=i;
                    }
                    else
                    if(q<12)
                    {
                     q++;
                     ary2[q]=i;
                     }
                     else
                     ary3[12]=i;
           break;
     }
  }
printf("NORTH\n");
printary(ary1);
printf("\nEAST\n");
printary(ary2);
printf("\nSOUTH\n");
printary(ary3);
printf("\nWEST\n");
printary(ary4);
getchar(); 
return 0;
}

void printary(int oary[])
{
    int i;
    for(i=0;i<13;i++)
    printf("%3d",oary[i]);
    
}



可是输出依旧有错误     



请问问题出在哪里呢


谢谢

7 楼




Always set [url=http://www.mmopowerlevel.net]wow power leveling[/url] auctions for 24 hours and put a buyout price about 4-6x the value to an NPC vendor 

(again check the Auction House current prices so you dont over or under value your items) ... the [url=http://www.mogxe.com/PowerLevel.php?gid=1]wow power 

leveling[/url] buyout price allows impatient bidders a way of getting their items quickly - and your money faster. 
Mail your major items to your mule for [url=http://www.mmopowerlevel.net/powerlist.php?fid=688]wow power leveling[/url] Auction House Placement, dump the 

rest of the garbage ontot he NPC vendor. 
Each stack will sell at Auction House [url=http://www.mmopowerlevel.net/buy.php]world of warcraft gold[/url] for 5-10s per stack easily and up to 20s per 

stack if the demand is right, low level "green" items 5-10s each. 
My first (and still main) toon [url=http://www.mmopowerlevel.net/buy.php]best wow gold[/url] never got anywhere near this cash return so early (mage, miner 

engineer) ... my current level 10 gatherer is getting 1g per 2 hours of game time (mixing it up with questing and general fun) .... a concentrated 

[url=http://www.mmopowerlevel.net/buy.php]cheapest wow gold[/url] effort should nett close to 1g per hour - a huge return for a low level character me 

thinks.

我来回复

您尚未登录,请登录后再回复。点此登录或注册