給定一個數組,要求把數組內元素的順序隨機打亂,而後輸出,主要是要保證效率。java
這個算法其實簡單,首先從全部元素中隨機選取一個與第一個元素進行交換,而後在第二個以後選擇一個元素與第二個交換,直到最後一個元素。這樣能確保每一個元素在每一個位置的機率都是1/n。代碼以下:算法
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 隨機打亂一個數組
void random(int a[], int n)
{
int index, tmp, i;
srand(time(NULL));
for (i = 0; i <n; i++)
{
index = rand() % (n - i) + i;
if (index != i)
{
tmp = a[i];
a[i] = a[index];
a[index] = tmp;
}
}
}
int main()
{
int a[] = {1, 2, 3, 4, 5};
int i;
random(a, 5);
for (i = 0; i < 5; i++)
printf("%d ", a[i]);
printf("\n");
system("pause");
return 0;
}
數組
把一個數組的順序打亂,很經常使用的算法,好比洗牌。dom
import java.util.Random;
public class RandomSort {
private Random random = new Random();
//數組大小
private static final int SIZE = 10;
//要重排序的數組
private int[] positions = new int[SIZE];
public RandomSort() {
for(int index=0; index<SIZE; index++) {
//初始化數組,如下標爲元素值
positions[index] = index;
}
//順序打印出數組的值
dwn();
}
//重排序
public void changePosition() {
for(int index=SIZE-1; index>=0; index--) {
//從0到index處之間隨機取一個值,跟index處的元素交換
exchange(random.nextInt(index+1), index);
}
dwn();
}
//交換位置
private void exchange(int p1, int p2) {
int temp = positions[p1];
positions[p1] = positions[p2];
positions[p2] = temp;
}
//打印數組的值
private void dwn() {
for(int index=0; index<SIZE; index++) {
System.out.print(positions[index]+" ");
}
System.out.println();
}
public static void main(String[] args) {
RandomSort rs = new RandomSort();
rs.changePosition();
rs.changePosition();
rs.changePosition();
}
}
不過因爲隨機數產生器產生的隨機數不太隨機,因此排序的結果頁有不少類似的地方。換一個好的隨機數產生器,會達到更好的效果,就能用於洗牌了。ide