有一副扑克分别存入char Cards[54]中,0,1表示大小王,2-14表示红桃2-A,15-27表示黑桃2-A,28-42表示梅花2-A,43-54表示方方2-A,要求写一个shuffle函数实现洗牌的功能。大家有好的算法写出来看看!分享一下:)

解决方案 »

  1.   


    利用随机数, k=rand()%54;产生2个数利用第三个变量 char 交换 数值循环 随机数次 >=1000
      

  2.   

    按实际情况的话,在洗牌的时候会把牌分成两到三份,所以产生两个不能同时为0和53的随机数,再把这不在这两个数范围内的牌一起移到Cards中的最前面,而位置在这两个数范围内的牌一起提到最后面,这是一次执行过程
      

  3.   


    我的方法:
    1、做一次循环:for(i=0;i<54;i++)2、在循环内部进行交换,详细方法如下:(1)、首先产生一个 0 到 53 之间的随机数,实际上是作为数组的下标;(2)、进行交换,先把 Cards[i] 放入临时变量中,然后 Cards[i]=Cards[随机数]     Cards[随机数]=临时变量3、结束循环
    把上面的程序做成函数,执行一次,一共交换54次;如果需要,多调用几次这个函数即可。函数如下:
    void Shuffle( unsigned char * pCards , unsigned char times = 1 )
    {
    int i,j; unsigned char k;  // 随机数
    unsigned char ucTemp;  // 临时变量 for(i=0;i<times;i++)
    {
    srand( (unsigned)time( NULL ) );  // 随机种子 for(j=0;j<54;j++)
    {
    k = rand()%53; ucTemp = *(pCards+i);
    *(pCards+i) = *(pCards+k);
    *(pCards+k) = ucTemp;
    }
    }
    }
      

  4.   

    同意这位仁兄的想法,很实际
    1.先定义三个数组a[],b[],c[],原牌序为all[]=a[]+b[]+c[]
    2.再定义两个Rand%54的变量,分别做为“取出”牌的上下标存储到b[]中
    3.进行排序,可写多类算法在里面,如原牌序为a[]+b[]+c[],现在的牌序为All[]=b[]+a[]+c[]
      

  5.   

    谢谢,3楼和5楼的方法也可行,不过我自己当时用的6楼的方法,
    时间紧没有时间多想:)void Shuffle(char Cards[54])
    {
    int i,j;
    char k; // 随机数
    char *temp; // 交换临时变量
    srand( (unsigned)time( NULL ) );
    for { j=0;j<54;j++)
    {
    k=rand()%54; //保存随机数
    temp=&Cards[j];
    Cards[j]=Cards[k];
    Cards[k]=*temp;
    }
    }
      

  6.   


    我产生数组下标时做错了,应改为:rand()%54这样才能保证取到 0 ~ 53 之间的下标。