Example #1
0
 private void CreateRing()
 {
     while (!stop)
     {
         int    red = 0; int green = 0; int blue = 0;
         Ball[] res = new Ball[3];
         res = d.GetRes();
         for (int i = 0; i < 3; i++)
         {
             red   += res[i].BgColor.R;
             green += res[i].BgColor.G;
             blue  += res[i].BgColor.B;
         }
         var  resClr = Color.FromArgb(red / 3, green / 3, blue / 3);
         Ring r      = new Ring(a.R, resClr);
         Monitor.Enter(a.rings);
         a.rings.Add(r);
         r.Start();
         Monitor.Exit(a.rings);
         Monitor.Enter(a.balls);
         foreach (var i in res)
         {
             i.Abort();
         }
         Monitor.Exit(a.balls);
     }
 }
Example #2
0
        public double[,] Tree1(Value value1)
        {
            int core_num;

            if (value1.MT == true)
            {
                core_num = System.Environment.ProcessorCount;
            }
            else
            {
                core_num = 1;
            }
            int task_num;

            if (value1.Trials % core_num == 0)
            {
                task_num = value1.Trials / core_num;
            }
            else
            {
                task_num = value1.Trials / core_num + 1;
            }
            double[,] tree = new double[task_num * core_num, value1.N + 1];
            double part1 = (value1.R - value1.Sigma * value1.Sigma / 2) * value1.T / value1.N;
            double part2 = value1.Sigma * Math.Sqrt(value1.T / value1.N);

            Action <object> Mthread = (mthread) =>
            {
                int tasks = Convert.ToInt32(mthread) + task_num;

                for (int i = Convert.ToInt32(mthread); i < tasks; i++)
                {
                    tree[i, 0] = value1.S;
                    for (int j = 0; j < value1.N; j++)
                    {
                        tree[i, j + 1] = tree[i, j] * Math.Exp(part1 + part2 * value1.Rn[i, j]);
                    }
                }
            };
            int           each_num = 0;
            List <Thread> thread   = new List <Thread>();

            for (int i = 0; i < core_num; i++)
            {
                Thread new_thread = new Thread(new ParameterizedThreadStart(Mthread));
                thread.Add(new_thread);
                new_thread.Start(each_num);
                each_num = each_num + task_num;
            }
            foreach (Thread i in thread)
            {
                i.Join();
            }
            foreach (Thread i in thread)
            {
                i.Abort();
            }
            return(tree);
        }
        //Create array
        public double[,] Rand(int Trials, int N, bool MT)
        {
            int core_num;

            if (MT == true)
            {
                core_num = System.Environment.ProcessorCount;
            }
            else
            {
                core_num = 1;
            }
            int task_num;

            if (Trials % core_num == 0)
            {
                task_num = Trials / core_num;
            }
            else
            {
                task_num = Trials / core_num + 1;
            }
            double[,] Rn = new double[task_num * core_num, N];

            Action <object> Mthread = (mthread) =>
            {
                int    tasks = Convert.ToInt32(mthread) + task_num;
                Random rnd   = new Random();
                for (int i = Convert.ToInt32(mthread); i < tasks; i++)
                {
                    for (int j = 0; j < N; j++)
                    {
                        Rn[i, j] = Polar(rnd);
                    }
                }
            };

            int           each_num = 0;
            List <Thread> thread   = new List <Thread>();

            for (int i = 0; i < core_num; i++)
            {
                Thread new_thread = new Thread(new ParameterizedThreadStart(Mthread));
                thread.Add(new_thread);
                new_thread.Start(each_num);
                each_num = each_num + task_num;
            }
            foreach (Thread i in thread)
            {
                i.Join();
            }
            foreach (Thread i in thread)
            {
                i.Abort();
            }
            return(Rn);
        }
Example #4
0
        public double[,] RNMT()
        {
            double[,] result = new double[Sims, Steps];
            int cores_num = System.Environment.ProcessorCount;
            int each_task = Sims / cores_num;
            //multithreading
            Action <object> Multi = (multi) =>
            {
                int    tasks = Convert.ToInt32(multi) + each_task;
                Random rnd1  = new Random(GetRandomSeed());
                Random rnd2  = new Random(GetRandomSeed());
                for (int i = Convert.ToInt32(multi); i < tasks; i++)
                {
                    for (int j = 0; j < Steps; j++)
                    {
                        //randn1 and randn2 are 2 uniform random values
                        //they between 0 and 1
                        double randn1, randn2;
                        double w;
                        //repeat until w > 1
                        do
                        {
                            randn1 = 2 * rnd1.NextDouble() - 1;
                            randn2 = 2 * rnd2.NextDouble() - 1;
                            w      = randn1 * randn1 + randn2 * randn2;
                        } while (w > 1);
                        //use the equations to calculate z1 and z2
                        double c = Math.Sqrt(-2 * Math.Log(w) / w);
                        result[i, j] = c * randn1;
                    }
                }
            };
            int           iter   = 0;
            List <Thread> thread = new List <Thread>();

            for (int i = 0; i < cores_num; i++)
            {
                Thread new_thread = new Thread(new ParameterizedThreadStart(Multi));
                thread.Add(new_thread);
                new_thread.Start(iter);
                iter = iter + each_task;
            }
            foreach (Thread i in thread)
            {
                i.Join();
            }
            foreach (Thread i in thread)
            {
                i.Abort();
            }
            return(result);
        }