2015-10-17 89 views
1

我已用C寫下面的程序以在ARANDOM順序K個分佈到M * N(M =行,N =列)陣列分配以隨機的順序的所有數字爲二維陣列,其中K = MN,使得每個小區從0到MN獲得唯一的號碼。但有一個問題。我得到一些重複的數字進入求和單元格。 我將如何獲得所有唯一的號碼?從一個給定清單

樣例程序:#

#include<stdio.h> 
#include<math.h> 
#include <time.h> 
#define row 5 
#define col 5 
int total=row*col; 
int A[row][col]; 


main() 
{ 
    int i,j; 
    srand(time(NULL)); 
    for(i=0;i<row;i++) 
{ 
    for(j=0;j<col;j++) 
    { 
     A[i][j]=rand()%total+1; 

    } 
} 

for(i=0;i<row;i++) 
{ 
    for(j=0;j<col;j++) 
    { 
     printf("\nA[%d][%d]=%d",i,j,A[i][j]); 

    } 
} 

} 
+0

所以你不想隨機*數字*,你想要一個隨機*排列*? – EOF

+0

是的。你是對的@EOF – ACE

+0

然而,設置最初的數字,然後隨機將它們與fisher yates shuffle? – thrig

回答

1

注意,說:「這些數字都是不同的」立即讓他們比說:「這些數字是隨機的」隨機少。你似乎覺得重複使整個數字的集合不那麼隨機,這是不正確的。

你似乎想置換。實現這一點的一種方式是進行隨機洗牌,即用唯一的數字初始化矩陣,然後隨機重複挑選兩個單元並交換其內容。毫無疑問,當你做了「足夠」的掉期交易時,有各種各樣的方式知道。

這裏有一個交換可以如何實現:

void random_point(int *x, int *y) 
{ 
    *x = rand() % col; 
    *y = rand() % row; 
} 

void permute(void) 
{ 
    int x1, y1, x2, y2; 
    random_point(&x1, &y1); 
    random_point(&x2, &y2); 
    const int tmp = A[y1][x1]; 
    A[y1][x1] = A[y2][x2]; 
    A[y2][x2] = tmp; 
} 

這是非常基本的。

+0

你能展示一個隨機排列的示例代碼嗎? @unwind – ACE

+0

@ACE https://www.google.com/search?q=c%20code%20random%20permutation – ace