2015-10-17 28 views
0

假設,有一個M * N(M =行,N =列)陣列和總的MN計算機(每個具有1至MN的ID)。我必須隨機在M * N陣列的每個單元中分配MN計算機,以便每個單元有一臺計算機。我將如何做到這一點?分發的東西固定數目爲M * N網格

示例代碼片段:

#include<stdio.h> 
#include<math.h> 
#define M 10 
#define N 10 
int main() 
{ 
    int A[M][N]; 
    int p=M*N; //total number of computers 
    //what to do here 
} 

我會有什麼額外的東西添加到前面的代碼來獲得我上述的結果呢?

+0

使用'rand'和'srand'功能。 – haccks

+0

將電腦隨機放置在網格中並隨機放置在一排中沒有區別。 –

+0

使用(僞)隨機數生成器並維護一組選定的項目。在每個步驟中,您生成一個隨機數* r *,選擇* r *:th未選擇的項目並將其標記爲已選。 –

回答

1

您可以使用randsrand功能。使用 實例:

/* initialize random seed: */ 
srand (time(NULL)); 
/* generate secret number between 1 and 10: */ 
randomNumber = rand() % 10 + 1; 

您可以檢查出蘭特here引用和函數srand here

1

有兩種方法。但是,你必須確保位置是獨一無二的,所有的計算機得到安置,所有插槽得到填補[一旦]

假設A是靜態/全局(例如它的全零)。

注:RAND()是stdlib.h中,但它不帶任何參數。所以:

#define xrand(_lim) (rand() % _lim) 

而且,由於M和N是#define語句,我會做#define P (M * N)

簡單和緩慢:

void 
place(void) 
{ 
    int compid; 
    int y; 
    int x; 

    for (compid = 1; compid <= P; ++compid) { 
     while (1) { 
      y = xrand(M); 
      x = xrand(N); 
      if (A[y][x] == 0) { 
       A[y][x] = compid; 
       break; 
      } 
     } 
    } 
} 

的另一種方法:

int used[P + 1]; 

void 
place(void) 
{ 
    int compid; 
    int y; 
    int x; 

    for (y = 0; y < M; ++y) { 
     for (x = 0; x < N; ++x) { 
      while (1) { 
       compid = xrand(P); 

       // we want 1..P not 0..P-1 
       compid += 1; 
       if (compid > P) 
        continue 

       if (used[compid] == 0) { 
        A[y][x] = compid; 
        used[compid] = 1; 
        break; 
       } 
      } 
     } 
    } 
} 
相關問題