作者angleevil (human)
看板C_and_CPP
標題Re: [問題] 亂數產生座標
時間Wed May 18 14:55:52 2011
※ 引述《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