コード例 #1
0
        /// <summary>
        /// Calcula a probabilidade de uma mão vencer.
        /// </summary>
        /// <param name="mao">Cartas da mão a ser avaliada. Pode ser 1 ou 2.</param>
        /// <param name="mesa">Cartas que já estão na mesa. De 0 a 5 cartas.</param>
        /// <param name="maoAdversaria">Cartas da mão adversária. Pode ser 0, 1 ou 2.</param>
        /// <param name="numeroRodadas">Número rodadas simuladas para convergência de resultados. Com 150k já convergem. </param>
        /// <returns>Probabilidade de ganhar. Ex: 50.10</returns>
        public static float GetRecalculaVitoriaParalelo(Carta[] maoAvaliada, Carta[] mesa, Carta[] maoAdversaria, uint numeroRodadas = 100000, int numeroThreads = 5)
        {
            int  numeroDeThreads = numeroThreads;
            bool haThreadExecutando = false;
            uint numFinalVitorias = 0, numFinalDerrotas = 0, numFinalEmpates = 0;

            Thread[] Threads = new Thread[numeroDeThreads];

            uint numeroRodadasPorThread = ((uint)(numeroRodadas / numeroDeThreads)) + 1;

            AvaliaProbabilidadeMao[] avaliaArray = new AvaliaProbabilidadeMao[numeroDeThreads];

            for (int i = 0; i < numeroDeThreads; i++)
            {
                avaliaArray[i] = new AvaliaProbabilidadeMao(maoAvaliada, maoAdversaria, mesa, numeroRodadasPorThread);
                Threads[i]     = new Thread(new ThreadStart(avaliaArray[i].Avalia));
                Threads[i].Start();
                haThreadExecutando = true;
            }

            while (haThreadExecutando)
            {
                Thread.Sleep(12);
                haThreadExecutando = false;

                for (int i = 0; i < numeroDeThreads; i++)
                {
                    if (Threads[i].IsAlive)
                    {
                        haThreadExecutando = true;
                    }
                }
            }

            for (int i = 0; i < numeroDeThreads; i++)
            {
                numFinalVitorias += avaliaArray[i].Vitorias;
                numFinalDerrotas += avaliaArray[i].Derrotas;
                numFinalEmpates  += avaliaArray[i].Empates;
            }

            float probabilidadeFinal = (((float)numFinalVitorias * 100) / (float)numeroRodadas);

            return(probabilidadeFinal);
        }
コード例 #2
0
 /// <summary>
 /// Calcula a probabilidade de uma mão vencer.
 /// </summary>
 /// <param name="mao">Cartas da mão a ser avaliada. Pode ser 1 ou 2.</param>
 /// <param name="mesa">Cartas que já estão na mesa. De 0 a 5 cartas.</param>
 /// <param name="numeroRodadas">Número rodadas simuladas para convergência de resultados. Com 150k já convergem. </param>
 /// <returns>Probabilidade de ganhar. Ex: 50.10</returns>
 public static float GetRecalculaVitoria(Carta [] mao, Carta[] mesa, uint numeroRodadas = 100000) => AvaliaProbabilidadeMao.GetRecalculaVitoriaParalelo(mao, mesa, null, numeroRodadas);