看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《sanabear (發憤圖強的熊小天 .__./)》之銘言: : 想用亂數取得不重複的N組(x,y)座標, : 可是有時候還是會出現重複的組合 : 想請問板上的各位,下面的程式碼哪裡有問題呢? : 謝謝 : #include <iostream> : #include <cstdlib> : #include <ctime> : #define n 20 //N個點 : using namespace std; : void finddata(); : int main() : { : int i,j,x[n],y[n],g[n],h[n],k,m; : srand(time(NULL)); : finddata(); : system("pause"); : return 0; : } : void finddata() : { : int i,j,x[n],y[n],g[n],h[n],k,m; : cout<<"-------------檢查前---------------\n"; //產生N點xy座標 : for(i=0;i<n;i++) : { : x[i]=rand()%5; : y[i]=rand()%5; : g[i]=x[i]; : h[i]=y[i]; : cout<<x[i]<<","<<y[i]<<"\t"; : } : cout<<"\n-------------檢查後---------------\n";//確認產生的N點沒有重複的XY : 組合 : for(i=1;i<n;i++) : { : for(j=0;j<i;j++) : { : while((x[i]==g[j])&&(y[i]==h[j])) : { : x[i]=rand()%5; : y[i]=rand()%5; : } : } : } : for(i=0;i<n;i++) : { : cout<<x[i]<<","<<y[i]<<"\t"; : } : } 可以用洗牌的原理來防止重複,因為我之前也做過類似的動作,不論怎麼給予新值,還是有重複可能 ex: #include <iostream> #include <cstdlib> #include <ctime> #define n 20 //N個點 void swap(int *val , int *val2) { int temp = 0; temp = *val; *val = *val2; *val2 = temp; } void Rand(int * ptr , int number) { for (int i = 0 ; i < number ; ++i) { swap(&ptr[i % n],&ptr[(rand() + i) % n]); } } int main() { int array[n] = {0}; for (int i = 0 ; i < n ; ++i) { array[i] = i + 1; } Rand(array,100); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.204.217
loveme00835:std::swap 表示: 05/18 14:57
angleevil:版主,自己寫的swap也要std::swap? 05/18 15:10
james732:板主意思應該是:有std::swap可以用,就別自己寫swap了 05/18 15:21
angleevil:=3= 我很久沒用c++了嗎 05/18 17:20
james732:其實我很久沒用了 XD 05/18 17:23
firejox:algorithm random_shuffle .... 05/18 18:21
diabloevagto:亂數的我會用另一個bool陣列,儲存是否有選取過了 05/18 18:57
firejox:在不大的情況下 我也會用位元運算XD 05/18 19:00
angleevil:= =竟然只要用random_shuffle就好,不知道為什麼有股怒氣 05/18 22:23
loveme00835:XD 05/18 22:30