http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
大公司面试题见过几次 今天实现以下 其实MODERN算法很简单
1. 实现的是in-place算法,以后有空把其他的完成
2. 每次启动程序种子需要变化,以当前时间为种子
#include <iostream> #include <time.h> void swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; }; void random_shuffling(int *a, int n) { int i = n - 1; int j; while(i > 0) { j = rand() % (i + 1); swap(&a[i], &a[j]); i--; } }; int main() { srand(time(0)); int a[10] = {1,2,3,4,5,6,7,8,9,10}; random_shuffling(a, 10); for(int i = 0; i < 10; i++) { std::cout << a[i] << " "; } return 0; }
增补:下面这个是一边初始化 一边shuffle算法 大同小异
#include <iostream> #include <time.h> const int N = 10; void swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; }; void random_shuffling(int *source) { int* res = new int[N]; res[0] = source[0]; int i = 1; int j; while(i < N) { j = rand() % (i + 1); res[i] = source[i]; swap(&res[i], &res[j]); i++; } for(int i = 0; i < N; i++) { std::cout << res[i] << " "; } }; int main() { srand(time(0)); int source[10] = {1,2,3,4,5,6,7,8,9,10}; random_shuffling(source); return 0; }
证明概率相等: