我正在尝试使用Polar Rejection方法创建一个随机数矩阵,其代码如下。我没有看到任何错误,但控制台没有显示任何结果。我的代码如下:
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 :(得分:0)
我发现有两件事我认为是这段代码中的错误:
for (i = 0; i < newTrials; ++j)
和for (j = 0; j < newSteps; ++i)
。你正在增加i中j循环的计数器和j中i循环的计数器。当我运行你的代码时,这会导致“System.IndexOutOfRangeException”,因为j循环没有在j循环中增加,因此循环没有停止。 Z[i, j] = Math.Sqrt(-2 * Math.Log(l[i, j]) / l[i, j]) * v[i, j];
在程序执行的这一点上,循环已经达到了上面声明的数组的范围。因此,如果用户输入10和10,则此代码正在调用Z[10, 10]
。由于数组基于零,因此只有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();