public override double optionprice_cv(out double se)
        {
            Simulation sim = new Simulation();

            double[,] stockmatrix = sim.simulation(trials, steps, r, T, sigma, s, randsaved, index_anti, threadingindex);
            double[,] payoff      = new double[trials, 1];
            double cv1, cv2;
            double delta, delta2;
            double dt      = T / steps;
            double num     = -1;
            double sum_ct  = 0;
            double sum_ct2 = 0;
            double d2;

            for (int i = 0; i < trials; i++)
            {
                cv1 = 0;
                cv2 = 0;

                for (int j = 1; j < steps; j++)
                {
                    double t  = (j - 1) * dt;
                    double d1 = ((Math.Log(stockmatrix[i, j - 1] / k) + (r + (sigma * sigma) * 0.5) * (T - t))) / (sigma * Math.Sqrt(T - t));
                    if (index == 1)
                    {
                        delta = CDF(d1);
                    }
                    else
                    {
                        delta = CDF(d1) - 1;
                    }
                    cv1 += delta * (stockmatrix[i, j] - (stockmatrix[i, j - 1] * Math.Exp(r * T / (steps - 1))));

                    if (index_anti)
                    {
                        d2 = ((Math.Log(stockmatrix[i + trials, j - 1] / k) + (r + (sigma * sigma) * 0.5) * (T - t))) / (sigma * Math.Sqrt(T - t));
                        if (index == 1)
                        {
                            delta2 = CDF(d2);
                        }
                        else
                        {
                            delta2 = CDF(d2) - 1;
                        }
                        cv2 += delta2 * (stockmatrix[i + trials, j] - (stockmatrix[i + trials, j - 1] * Math.Exp(r * T / (steps - 1))));
                    }
                }

                if (index == 1)
                {
                    if (index_anti)
                    {
                        double ave1 = 0;
                        double ave2 = 0;
                        for (int j = 0; j < stockmatrix.GetLength(1); j++)
                        {
                            ave1 = stockmatrix[i, j] + ave1;
                            ave2 = stockmatrix[i + trials, j] + ave2;
                        }
                        ave1         = ave1 / stockmatrix.GetLength(1);
                        ave2         = ave2 / stockmatrix.GetLength(1);
                        payoff[i, 0] = 0.5 * ((Math.Max(ave1 - k, 0) + num * cv1) + (Math.Max(ave2 - k, 0) + num * cv2));
                    }
                    else
                    {
                        double ave = 0;
                        for (int j = 0; j < stockmatrix.GetLength(1); j++)
                        {
                            ave = stockmatrix[i, j] + ave;
                        }
                        ave          = ave / stockmatrix.GetLength(1);
                        payoff[i, 0] = Math.Max(ave - k, 0) + num * cv1;
                    }
                }

                else
                {
                    if (index_anti)
                    {
                        double ave1 = 0;
                        double ave2 = 0;
                        for (int j = 0; j < stockmatrix.GetLength(1); j++)
                        {
                            ave1 = stockmatrix[i, j] + ave1;
                            ave2 = stockmatrix[i + trials, j] + ave2;
                        }
                        ave1         = ave1 / stockmatrix.GetLength(1);
                        ave2         = ave2 / stockmatrix.GetLength(1);
                        payoff[i, 0] = 0.5 * ((Math.Max(k - ave1, 0) + num * cv1) + (Math.Max(k - ave2, 0) + num * cv2));
                    }
                    else
                    {
                        double ave = 0;
                        for (int j = 0; j < stockmatrix.GetLength(1); j++)
                        {
                            ave = stockmatrix[i, j] + ave;
                        }
                        ave          = ave / stockmatrix.GetLength(1);
                        payoff[i, 0] = Math.Max(k - ave, 0) + num * cv1;
                    }
                }

                sum_ct  += payoff[i, 0];
                sum_ct2 += Math.Pow(payoff[i, 0], 2);
            }

            double price = (sum_ct / Convert.ToDouble(trials)) * Math.Exp(-r * T);
            double std   = Math.Sqrt((sum_ct2 - sum_ct * sum_ct / Convert.ToDouble(trials)) * Math.Exp(-2 * r * T) / (Convert.ToDouble(trials - 1)));

            se = std / Math.Sqrt(trials);
            return(price);
        }
        public override double optionprice(out double se)
        {
            Simulation sim = new Simulation();

            double[,] stockmatrix = sim.simulation(trials, steps, r, T, sigma, s, randsaved, index_anti, threadingindex);
            double[,] payoff;
            if (index_anti)
            {
                payoff = new double[trials * 2, 1];
            }
            else
            {
                payoff = new double[trials, 1];
            }


            if (index == 1)
            {
                for (int i = 0; i < stockmatrix.GetLength(0); i++)
                {
                    double ave = 0;
                    for (int j = 0; j < stockmatrix.GetLength(1); j++)
                    {
                        ave = stockmatrix[i, j] + ave;
                    }
                    ave          = ave / stockmatrix.GetLength(1);
                    payoff[i, 0] = Math.Max((ave - k), 0);
                }
            }

            if (index != 1)
            {
                for (int i = 0; i < stockmatrix.GetLength(0); i++)
                {
                    double ave = 0;
                    for (int j = 0; j < stockmatrix.GetLength(1); j++)
                    {
                        ave = stockmatrix[i, j] + ave;
                    }
                    ave          = ave / stockmatrix.GetLength(1);
                    payoff[i, 0] = Math.Max((k - ave), 0);
                }
            }

            double sum    = 0;
            double sum_se = 0;

            for (int i = 0; i < trials; i++)
            {
                sum += payoff[i, 0];
            }
            double price = (sum / Convert.ToDouble(trials)) * Math.Exp(-r * T);

            if (index_anti)
            {
                double[,] ave_p = new double[trials, 1];
                for (int i = 0; i < trials; i++)
                {
                    ave_p[i, 0] = (payoff[i, 0] + payoff[i + trials, 0]) * 0.5;
                }

                for (int i = 0; i < trials; i++)
                {
                    sum_se += Math.Pow((ave_p[i, 0] * Math.Exp(-r * T)) - price, 2);
                }
            }
            else
            {
                for (int i = 0; i < trials; i++)
                {
                    sum_se += Math.Pow((payoff[i, 0] * Math.Exp(-r * T)) - price, 2);
                }
            }

            double std = Math.Sqrt((1 / Convert.ToDouble((trials - 1))) * sum_se);

            se = std / Math.Sqrt(trials);

            return(price);
        }