方法描述:
1。随机产生一个1-n的数x,然后让第x张牌和第1张牌互相调换。
2。随机产生一个1-n的数y,然后让第y张牌和第2张牌互相调换。
3。随机产生一个1-n的数z,然后让第z张牌和第i张牌互相调换。(i=3,4,5...54)
这种算法的复杂度为O(N)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static void Shuffle(int a[], int num)
{
int i, index;
int temp;
srand((int)time(0));
for(i=num; i>0; i--)
{
index = rand()%i;
temp = a[i-1];
a[i-1] = a[index];
a[index] = temp;
}
}
static void Print(int a[], int num)
{
int i;
for(i=0; i<num; i++)
printf("%d---%d\n", i+1, a[i]);
}
#define CardNum (52)
int main()
{
int a[CardNum];
int i;
printf("sizeof = %d\n", sizeof(size_t));
for(i=0; i<CardNum; i++)
a[i] = i+1;
Print(a, CardNum);
Shuffle(a, CardNum);
Print(a, CardNum);
return 0;
}