一个很小的洗牌算法

来源:互联网 发布:开淘宝代购护肤品店 编辑:程序博客网 时间:2024/05/08 05:31

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


原创粉丝点击