洗牌演算法:隨機打亂一個數組的順序
阿新 • • 發佈:2019-01-25
給定一個數組,要求把陣列內元素的順序隨機打亂,然後輸出,主要是要保證效率。
這其實是個洗牌演算法,首先從所有元素中隨機選取一個與第一個元素進行交換,然後在第二個之後選擇一個元素與第二個交換,直到最後一個元素。這樣能確保每個元素在每個位置的概率都是1/n。
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; void random(int a[], int n) { int index, tmp, i; srand(time(NULL));//以現在的系統時間作為隨機數的種子產生隨機數 for(i=0; i<n; i++) { index=rand()%(n-i)+i;//獲取[i,n-1]之間的一個隨機數 if(index!=i) { tmp=a[i]; a[i]=a[index]; a[index]=tmp; } } } int main() { int a[100]; int i; for(i=0; i<100; i++) a[i]=i; random(a, 100); for(i=0; i<100; i++) cout<<a[i]<<" "; cout<<endl; return 0; }
也可以從後往前,程式碼相對簡單一點
01.#include <iostream> 02.#include <stdio.h> 03.#include <stdlib.h> 04.#include <time.h> 05.using namespace std; 06. 07.void random(int a[], int n) 08.{ 09. int index, tmp, i; 10. srand(time(NULL)); 11. 12. for(i=n-1; i>0; i--) 13. { 14. index=rand()%i; 15. tmp=a[i]; 16. a[i]=a[index]; 17. a[index]=tmp; 18. } 19. 20.} 21. 22.int main() 23.{ 24. int a[100]; 25. int i; 26. for(i=0; i<100; i++) 27. a[i]=i; 28. random(a, 100); 29. for(i=0; i<100; i++) 30. cout<<a[i]<<" "; 31. cout<<endl; 32. return 0; 33.} #include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; void random(int a[], int n) { int index, tmp, i; srand(time(NULL)); for(i=n-1; i>0; i--) { index=rand()%i; tmp=a[i]; a[i]=a[index]; a[index]=tmp; } } int main() { int a[100]; int i; for(i=0; i<100; i++) a[i]=i; random(a, 100); for(i=0; i<100; i++) cout<<a[i]<<" "; cout<<endl; return 0; }