根據排列組合的思想 :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 ]的隨機數。