Re: [問題] 亂數產生座標
※ 引述《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
→
05/18 14:57, , 1F
05/18 14:57, 1F
→
05/18 15:10, , 2F
05/18 15:10, 2F
→
05/18 15:21, , 3F
05/18 15:21, 3F
→
05/18 17:20, , 4F
05/18 17:20, 4F
→
05/18 17:23, , 5F
05/18 17:23, 5F
→
05/18 18:21, , 6F
05/18 18:21, 6F
→
05/18 18:57, , 7F
05/18 18:57, 7F
→
05/18 19:00, , 8F
05/18 19:00, 8F
→
05/18 22:23, , 9F
05/18 22:23, 9F
→
05/18 22:30, , 10F
05/18 22:30, 10F
討論串 (同標題文章)