算法的出处不清楚了,知道的请告诉我一下,多谢 ^_^
思路挺简单也挺有意思,就是在一组数中随机出一个索引值然后跟当前索引对应的值做交换以达到打乱数组值顺序的目的。
这里有一个优化点,就是在交换的时候对于之前已经执行过交换的索引则不再进行重复交换以达到最大的随机性。
/**
* 洗牌算法
*
* @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;
}