2014-01-21 50 views
2

對於一些課程我需要通過蠻力生成一個正常的魔方,這是代碼的一部分。僅供參考;我不允許使用除了常用的以外的任何類別。 (我可能推我的運氣Math.Pow)在調試期間工作,運行時失敗?

我有以下的方法來生成一個二維尺寸N×N個:

static int[,] GenerateSquare(int n) 
    { 
     int[,] sqarray = new int[n,n]; 
     int[] rndarray = new int[n]; 

     //puts completely random integers from 1 to n^2 in all elements of the square array (sqarray) 
     for (int i = 0; i < n; i++) 
     { 
      rndarray = FullRndArray(n); 

      for (int j = 0; j < n; j++) 
      { 
       sqarray[i, j] = rndarray[j]; 
      } 
     } 

     return sqarray; 
    } 

的FullRndArray()方法如下:

static int[] FullRndArray(int n) 
    { 
     //creates an array of size n and fills with random intigers between 1 and n^2 
     int[] rndarray = new int[n]; 
     Random rnd = new Random(); 

     int ntothe2 = Convert.ToInt32(Math.Pow(n, 2)); 

     for (int i = 0; i < n; i++) 
      rndarray[i] = rnd.Next(1, ntothe2 + 1); 

     return rndarray; 
    } 

問題是,當我運行這個代碼時,每行的內容是隨機的,但每一行的正方形與最後一行相同(即1-1,1-2,1-3是相同的2-1,2-2,2-3,分別與3-1,3-2,3-3相同)。然而,當我逐行通過調試器時,我最終會在每個空間中產生一組完美的隨機數字。任何人都可以向我解釋這個錯誤嗎?

+0

只需使用'n * n'即可消除'Math.Pow'。一般來說,除非要四捨五入,否則可以使用'(int)'而不是'Convert.Int32'。 – Gabe

回答

5

這是罪魁禍首:

Random rnd = new Random(); 

隨機數生成從種子開始:相同的種子是指數的相同不那麼隨機序列Random使用當前時間作爲種子,所以當你運行你的代碼時,它運行得非常快,你將創建兩個具有相同種子的Randoms,然後生成兩個相同的行。另一方面,當你在調試時,讓足夠的時間通過,一切都按預期進行。
解決方法是創建一個實例Random,靜態或在GenerateSquare開頭,並將其用於整個過程。

+0

非常感謝您的解釋! :) 工程現在或多或少地好 – IamPancakeMan

1

我得到了與您描述的行爲完全相同的行爲。

這似乎工作:

static int[,] GenerateSquare(int n) 
{ 
    int[,] sqarray = new int[n, n]; 
    int[] rndarray = new int[n]; 

    Random rnd = new Random(); 
    //puts completely random integers from 1 to n^2 in all elements of the square array (sqarray) 
    for (int i = 0; i < n; i++) 
    { 
     rndarray = FullRndArray(n, rnd); 
     for (int j = 0; j < n; j++) 
     { 
      sqarray[i, j] = rndarray[j]; 
     } 
    } 

    return sqarray; 
} 
static int[] FullRndArray(int n, Random rnd) 
{ 
    //creates an array of size n and fills with random intigers between 1 and n^2 
    int[] rndarray = new int[n]; 

    int ntothe2 = Convert.ToInt32(Math.Pow(n, 2)); 

    for (int i = 0; i < n; i++) 
     rndarray[i] = rnd.Next(1, ntothe2 + 1); 

    return rndarray; 
} 

我明白,我們必須使用Random.Next()方法在同一實例,以便爲「真」隨機的(如BlackBear答案描述)。

它可能在調試過程中起作用,因爲您在步驟之間引入了時間段。

+0

謝謝你的示例修復:) – IamPancakeMan

相關問題