2014-02-24 21 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