[問題] 亂數產生座標

看板C_and_CPP作者 (發憤圖強的熊小天 .__./)時間14年前 (2011/05/18 13:01), 編輯推噓0(008)
留言8則, 3人參與, 最新討論串1/2 (看更多)
想用亂數取得不重複的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"; } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.246.84

05/18 13:08, , 1F
如果你的點只有 (0, 0) 至 (4, 4) 這25種組合的話
05/18 13:08, 1F

05/18 13:09, , 2F
我會想把這25種組合都做出來,挑出其中20種
05/18 13:09, 2F
謝謝J大 組合數目N 是要讓使用者自行輸入的,現在先定義為20 還有RAND()%5 都是我想先測試看看跑出來的結果有沒有重複,檢測程式碼有沒有問題XD 只是目前這樣會有問題發生,所以.....OTZ ※ 編輯: sanabear 來自: 140.138.246.84 (05/18 13:20)

05/18 13:22, , 3F
你的程式碼在發現重覆的時候,會重新產生一組
05/18 13:22, 3F

05/18 13:23, , 4F
算了忽略我上一個推文 XD
05/18 13:23, 4F

05/18 14:25, , 5F
你應該是先讓陣列依序塞滿值(1~n-1),然後再用洗牌的原理
05/18 14:25, 5F

05/18 14:26, , 6F
將陣列的值做交換,
05/18 14:26, 6F

05/18 14:28, , 7F
因為就算檢查到某個值是重複的,給予新的值,還是會重複到
05/18 14:28, 7F

05/18 14:50, , 8F
有沒有 o p q r s 勒?
05/18 14:50, 8F
文章代碼(AID): #1DqrAbpJ (C_and_CPP)
文章代碼(AID): #1DqrAbpJ (C_and_CPP)