使用极化拒绝的随机数矩阵

时间:2014-02-24 01:42:21

标签: c#

我正在尝试使用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();
        }
        }
    }

1 个答案:

答案 0 :(得分: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[9,9]的上限,这也会引发“System.IndexOutOfRangeException”。
  3. 第二个问题的另一个结果是你只是写了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();