隨機算法——洗牌算法

算法的出處不清楚了,知道的請告訴我一下,多謝 ^_^算法

思路挺簡單也挺有意思,就是在一組數中隨機出一個索引值而後跟當前索引對應的值作交換以達到打亂數組值順序的目的。數組

這裏有一個優化點,就是在交換的時候對於以前已經執行過交換的索引則再也不進行重複交換以達到最大的隨機性。優化

 

/**
 * 洗牌算法
 *
 * @autho koma<komazhang@foxmail.com>
**/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 9

int main(int argc, char **argv)
{
    int arr[MAX];
    int i, idx;
    int tmp;

    //init
    for ( i = 0; i < MAX; i++ ) { 
        arr[i] = i;  
    }   

    //do shuffling
    srand((unsigned) time(NULL));
    for ( i = 0; i < MAX; i++ ) { 
        //idx = rand() % MAX;
        idx = i + rand() % (MAX - i); 

        printf("idx = %d, i = %d \n", idx, i); 

        tmp      = arr[idx];
        arr[idx] = arr[i];
        arr[i]   = tmp;
    }   


    //printf arr
    printf("\n------------------\n");
    for ( i = 0; i < MAX; i++ ) { 
        printf("%d ", arr[i]);
    }   
    printf("\n------------------\n");


    return 0;
}
相關文章
相關標籤/搜索