根据排列组合的思想 :54张牌共有54!种不同排列,据此,可安排随机数范围从而定位,然后和固定的空间交换,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void swap(int *x, int *y)
{
if ( x != y ) {
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
}
int main(void)
{
int i, j, card[54];
#define TEST
for ( i = 1; i <= 54; i++ ) {
card[i-1] = i;
}
srand(time(NULL));
for ( i = 54; i > 0; i-- ) {
j = rand() % i;
swap(&card[i-1], &card[j]);
}
#ifdef TEST
for ( i = 0; i < 54; i++ )
printf("%d\t", card[i]);
printf("\n");
#endif
return 0;
}
函数swap的指针参数x和y如果指向同样的空间,则不能继续计算,因为这样值会被置0.rand函数根据srand函数的种子产生[ 0 - RAND_MAX ]的随机数,所以rand() % i 生成 [ 0 - i-1 ]的随机数。