假設須要生成前N個天然數的一個隨機置換。例如,{3,4,1,5,2}和{5,2,3,1,4}就是合法的置換,但{5,4,1,2,1}卻不是,由於數1出現了兩次而數3卻沒有。 這個程序經常使用語模擬一些算法。咱們假設存在一個隨機數生成器RandInt(i,j),它以相同的機率生成i和j之間的一個整數。下面是三個算法:php
for (i = 1; i < N; i++) { Swap(&A[i], &A[RandInt(0, i)]); }
// 隨機置換方法一 extern void RandRangOne(int[], int); // 隨機置換方法二 extern void RandRangTwo(int[], int);
#include <stdio.h> #include <stdlib.h> #include <time.h> /** * 產生[min, max]之間的一個隨機數 * 注:參考PHP隨機數生成的處理 * @param min * @param max * @return */ int RandInt(int min, int max) { srand((unsigned int)(time(0) * getpid()) ^ (unsigned int)(1000000.0)); return min + (int)((double)((double)(max) - (min) + 1.0) * ((rand()) / ((RAND_MAX) + 1.0))); } /** * 隨機置換算法一 * @param a * @param size */ void RandRangOne(int a[], int size) { int i; for (i = 0; i < size; i++) { while (1) { int rand = RandInt(1, size); int flag = 0; int j; for (j = 0; j < i; j++) { if (a[j] == rand) { flag = 1; break; } } if (flag) { continue; } a[i] = rand; break; } } } /** * 隨機置換算法二 * @param a * @param size */ void RandRangTwo(int a[], int size) { int used[size], i; for (i = 0; i < size; i++) { while (1) { int rand = RandInt(1, size); if (used[rand] == 1) { continue; } a[i] = rand; used[rand] = 1; break; } } }
#include <stdio.h> #include <stdlib.h> #include "ext/s8/fun.h" int main(int argc, char** argv) { int a[10]; RandRangTwo(a, 10); int i; for(i = 0; i < 10; i++) { printf("%d\n", a[i]); } return (EXIT_SUCCESS); }