產生不重複的亂數 (使用陣列)-2-(亂數組-交換法)

延續上一篇用紀錄數值到陣列、紀錄數值出現次數的計數(建表法),另外嘗試用另一個方式來解出試題,這方式(交換法)是將數值依序記入陣列中【即n[0]=1,n[1]=2......n[9]=10】,接下來用亂數取得要交換的組別,直到全部完成。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand(time(0));
int i,n[10]={0};
for(i=1;i<=10;++i){
n[i-1]=i;              /////數值依序紀錄在陣列中
}
for(i=1;i<=10;++i){  ////至於為什麼減11,因為一共剩下X組可交換(第1次有10組)
int j=rand()%(11-i)+i;   ////j為亂數,用於指定交換陣列的組別。
int t=n[i-1];    ////將第n[i-1]組數值搬入t,第一次就是n[0]。
n[i-1]=n[j-1]; ////將第n[j]組搬入n[i-1],亂數5給j,就是n[j-1]搬過去n[i-1]
n[j-1]=t;     ////再將原來的n[i-1]組的數值暫存在t的搬過去n[j-1]。
printf("%d ",n[i-1]);
}
return 0;
}

因為j為亂數,也是要交換的指定組別,所以也是等於隨機交換的。

做counter、swap在許多思考與應用上很重要,有時也很有用,這裡是將counter、swap運用在陣列上。

留言