/// <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); }
/// <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);