private void button_iniciar_simulacion_Click(object sender, EventArgs e)
        {
            button_iniciar_simulacion.Enabled = false;
            progressBar1.Visible    = true;
            button_cancelar.Visible = true;
            progressBar1.Value      = 0;

            DSimulacionTest st = new DSimulacionTest();

            st.multA = (int)numericUpDown_primera_etapa.Value;
            st.multB = (int)numericUpDown_segunda_etapa.Value;
            st.nSim  = (int)numericUpDown_numero_de_simulaciones.Value;
            st.nInfectadosPorMillon = (double)numericUpDown_infectados_por_millon_supuesto.Value;
            st.listaDePersonas      = new bool[st.multA * st.multB];
            textBox1_resultado.Text = "";
            backgroundWorker1.RunWorkerAsync(st);
        }
        private double BackgroundProcess_Simulacion(BackgroundWorker bw, DoWorkEventArgs e)
        {
            //double result = 0;
            int             progress;
            int             sumaCompleta = 0;
            DSimulacionTest st           = (DSimulacionTest)e.Argument;

            for (int i = 0; i < st.nSim; i++)
            {
                //Thread.Sleep(10);
                int numeroDeTest = IndividualSimulacion(st);
                sumaCompleta += numeroDeTest;

                progress = (int)((i * 100.0) / st.nSim);
                bw.ReportProgress(progress);
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    return(0);
                }
            }

            return((sumaCompleta * 100.0) / st.nSim);
        }
        /// <summary>
        /// Procesa una simulación, y devuelve el número de test que fueron necesarios
        /// </summary>
        /// <param name="st"></param>
        /// <returns></returns>
        private int IndividualSimulacion(DSimulacionTest st)
        {
            int res = 0;

            //Carga el arreglo de personas, con datos aleatorios
            int p = (int)(1000000.0 / st.nInfectadosPorMillon);

            for (int i = 0; i < st.multA; i++)
            {
                for (int j = 0; j < st.multB; j++)
                {
                    st.listaDePersonas[i * st.multB + j] = rmd.Next(p) == 1;//También se puede poner "== 0", la idea es poner un número bajo que sea menor que p, donde p es probable que tome valores mayores a 1000, al menos que los infectados por millón tenga una cifra muy alta
                }
            }

            ////código auxiliar para contar la cantidad de infectados que produju la carga aleatoria
            //for (int i = 0; i < st.multA; i++)
            //{
            //    for (int j = 0; j < st.multB; j++)
            //    {
            //        if (st.listaDePersonas[i * st.multB + j])
            //        {
            //            res++;
            //        }
            //    }
            //}

            //Test primera etapa
            //Se prueban todos los casos al mismo tiempo, con un solo test
            res = 1;
            bool q = false;

            for (int i = 0; i < st.multA; i++)
            {
                for (int j = 0; j < st.multB; j++)
                {
                    if (st.listaDePersonas[i * st.multB + j])
                    {
                        //Se encontró al menos un infectado
                        q = true;
                        break;
                    }
                }
                if (q)
                {
                    break;
                }
            }
            if (!q)
            {
                return(res);
            }

            //Test segunda etapa
            res += st.multA;
            for (int i = 0; i < st.multA; i++)
            {
                q = false;
                for (int j = 0; j < st.multB; j++)
                {
                    if (st.listaDePersonas[i * st.multB + j])
                    {
                        //Se encontró al menos un infectado
                        q = true;
                        break;
                    }
                }
                if (q)
                {
                    //Se tienen que realizar todos los test de la última etapa, para poder identificar los infectados
                    res += st.multB;
                }
            }

            return(res);
        }