尋找將1~N的整數隨機排列的高效方法

lt發表於2016-06-23

我想到的是:先把陣列按照順序初始化,然後隨機從1~N-1取一個位置,把這個位置的值與放在N位置的值交換,然後再隨機從1~N-2取一個,與放在N-1位置的值交換...直到只剩一個,放在那裡不動。最終結果正好是倒序的每次取出的隨機數,但有的數可能會被多次取到。

#include <stdio.h>
#define N 14
#define P {int i;for(i=1;i<=N;i++)printf("%d ",a[i]);printf("\n");}
int main()
{
int i=0;
int a[N+1];
int temp=0;
int j=0;
for(i=1;i<=N;i++) a[i]=i;
P
for(i=1;i<N;i++) 
{
j=rand()%(N-i)+1;
temp=a[j];
a[j]=a[N-i+1];
a[N-i+1]=temp;
P
}
return 1;
}

比如: 初始化 1 2 3 4 5
1. 找到1~4的隨機數3,序列變為1 2 [5] 4 [3]
2. 找到1~3的隨機數2,序列變為1 [4] 5 [2] 3
3. 找到1~2的隨機數2,序列變為1 [5] [4] 2 3
其中4這個數就多次被取到。

相關文章