一个很小的洗牌算法

根据排列组合的思想 :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 ]的随机数。


你可能感兴趣的:(算法,null)