一個很小的洗牌算法

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章