1. 程式人生 > >洗牌演算法:隨機打亂一個數組的順序

洗牌演算法:隨機打亂一個數組的順序

給定一個數組,要求把陣列內元素的順序隨機打亂,然後輸出,主要是要保證效率。

這其實是個洗牌演算法,首先從所有元素中隨機選取一個與第一個元素進行交換,然後在第二個之後選擇一個元素與第二個交換,直到最後一個元素。這樣能確保每個元素在每個位置的概率都是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;
}