麻将洗牌算法及实现
/*-----------------------------------------------------------------------------
*该函数为牌墙洗牌
*先分配一个temparr[143]的数组(牌堆),依次赋值为0~35,每个数字的个数为4个;
* 设置剩余牌数为144;
* 当剩余牌数不为0时:
* 产生一个随机数n;
* 将n模去剩余牌数再加一赋值给num;
* 在牌堆里找到第num个牌,存进牌墙中;
*
*
*作者:yutian(于恬)
*E_main:yution@126.com
*
*作者声明:本代码为学习时编写的代码,大家可以随意转贴及编译修改
*但不得用于商业用途和赌博,作者保留一切权力
******************************************************************************/
#include <math.h>
#include <time.h>
#include <stdlib.h>
int arr[143];
int main()
{
system("date +%H%M%S%N");
int temparr[143];
int i,j,rempai;
for(i=0;i<144;i++)
{
arr[i]=-2;
}
j=0;
rempai=144;
for(i=0;i<144;i++)
{
temparr[i]=i/4;
}
int count=0;
for(i=0;i<0;i++)
{
if(count==8)
{
printf("
");
count=0;
}
printf("%d ",temparr[i]);
count++;
}
//printf("
");
while(rempai)
{
srand((unsigned)time(NULL));
int num=random()%rempai+1;
for(i=0;i<144;i++)
{
if(temparr[i]!=-1) num--;
if(!num)
{
arr[j]=temparr[i];
j++;
rempai--;
temparr[i]=-1;
break;
}
}
}
system("date +%H%M%S%N");
count=0;
for(i=0;i<144;i++)
{
if(count==8)
{
printf("
");
count=0;
}
printf("%d ",arr[i]);
count++;
}
printf("
");
printf("
");
}
在CentOS上编译通过,PIII处理器,处理的时间(不包括打印部分)不超过20毫秒,一般落在15~17毫秒之间