2014-02-24 19 views
0

我想用下面的代碼使用極性排斥法創建一個隨機數矩陣。我沒有看到任何錯誤,但控制檯不顯示任何結果。我的代碼如下:使用極性排斥的隨機數矩陣

class Program 
    { 
     static void Main(string[] args) 
     { 
      Program.GenerateRandom(); 
     } 
     public static void GenerateRandom() 
     { 
      Console.WriteLine("Please enter newtrials."); 
      int newTrials=Convert.ToInt32(Console.ReadLine()); 
      Console.WriteLine("Please enter Steps."); 
      int newSteps = Convert.ToInt32(Console.ReadLine()); 
       int i = 0; 
      int j = 0; 
      double[,] v = new double[newTrials,newSteps]; 
      double[,] d = new double[newTrials, newSteps]; 
      double[,] l = new double[newTrials, newSteps]; 
      double[,] Z = new double[newTrials, newSteps]; 
      for (i = 0; i < newTrials; ++j) 
       { 
        for (j = 0; j < newSteps; ++i) 
        { 
         do 
         { 
          Random rnd = new Random(); 
          v[i, j] = 2 * rnd.NextDouble() - 1; 
          d[i, j] = 2 * rnd.NextDouble() - 1; ; 
          l[i, j] = Math.Pow(v[i, j], 2) + Math.Pow(d[i, j], 2); 
         } 
         while (l[i, j] >= 1.0); 
        } 
        Z[i, j] = Math.Sqrt(-2 * Math.Log(l[i, j])/l[i, j]) * v[i, j]; 

       } 

      Console.WriteLine("values are:{0},{1}",Z[0,0],Z[0,1]); 
      Console.ReadLine(); 
     } 
     } 
    } 
+0

你永遠j增加在你的代碼。在您的for循環中反向++ i,++ j,即在第一個循環中使用++ i,在第二個循環中使用++ j。 –

+1

作爲一個方面說明,如果你在你的循環中實例化Random,你會根據系統時間獲得很多重複的數字作爲Random的種子。你應該在循環之外移動實例。 – Enigmativity

回答

0

我看到兩件事情,是我認爲是錯誤,在此代碼:

  1. for (i = 0; i < newTrials; ++j)for (j = 0; j < newSteps; ++i)。你正在增加i中的j循環的計數器和j中的i循環的計數器。當我運行你的代碼時,這會導致一個「System.IndexOutOfRangeException」,因爲j循環沒有在j循環中增加,因此循環沒有停止。
  2. Z[i, j] = Math.Sqrt(-2 * Math.Log(l[i, j])/l[i, j]) * v[i, j];在程序執行的這一點上,循環已經達到了你在上面聲明的數組的邊界。所以如果用戶輸入10和10這個代碼是調用Z[10, 10]。由於數組基於零,所以Z只有Z[9,9]的上界,這也引發了一個「System.IndexOutOfRangeException」。

第二個問題的另一個結果是,你只寫了一個答案的Z數組的第二維的最後一個索引。這意味着,如果我們再次使用10和10的例子,結果將只寫入Z [0,9],Z [1,9],Z [2,9],Z [3,9],Z [4, 9],Z [5,9],Z [6,9],Z [7,9],Z [8,9]和Z [9,9]。我不確定你打算如何處理這段代碼,但我認爲你有一些邏輯錯誤。

我想你想要像下面這樣:

Console.WriteLine("Please enter newtrials."); 
int newTrials = Convert.ToInt32(Console.ReadLine()); 
Console.WriteLine("Please enter Steps."); 
int newSteps = Convert.ToInt32(Console.ReadLine()); 
int i = 0; 
int j = 0; 
double[,] v = new double[newTrials, newSteps]; 
double[,] d = new double[newTrials, newSteps]; 
double[,] l = new double[newTrials, newSteps]; 
double[,] Z = new double[newTrials, newSteps]; 
Random rnd = new Random(); 
for (i = 0; i < newTrials; i++) 
{ 
    for (j = 0; j < newSteps; j++) 
    { 
     do 
     { 
      v[i, j] = 2.0 * rnd.NextDouble() - 1.0; 
      d[i, j] = 2.0 * rnd.NextDouble() - 1.0; 
      l[i, j] = Math.Pow(v[i, j], 2.0) + Math.Pow(d[i, j], 2.0); 
     } 
     while (l[i, j] >= 1.0); 
     Z[i, j] = Math.Sqrt(-2 * Math.Log(l[i, j])/l[i, j]) * v[i, j]; 
    } 
} 

for (i = 0; i < newTrials; i++) 
{ 
    Console.Write("["); 
    for (j = 0; j < newSteps; j++) 
    { 
     Console.Write("{0}, ", Z[i, j]); 
    } 
    Console.Write("]\n"); 
}    
Console.ReadLine(); 
+0

謝謝你的有用評論。我試圖模擬一個隨機數矩陣,例如10乘4,其中10是newTrials,4是newSteps。對於給定的newTrials索引;即'j'我需要4個隨機數。這應該繼續進行10次試驗。因此,Z應該是一個10乘4的隨機數矩陣。你能提出任何解決方案嗎?我非常厭煩嘗試兩天。 – user3341894

+0

我繼續並修復了我和j。但是,現在我的Z矩陣超出了Array的範圍。 – user3341894

+0

請使用更新後的代碼查看我的更新評論。我相信這就是你要找的。 – Dex