[c#]Calcolo probabilita vincita poker

di il
14 risposte

[c#]Calcolo probabilita vincita poker

Volevo sapere come posso calcolare le poprabilita di vincita di una mano da parte di un giocatore conoscendo le due carte in mano ai due giocatori e le carti sul bord come posso fare

14 Risposte

  • Re: [c#]Calcolo probabilita vincita poker

    Questo è il codice che utilizzo per calcolare tutte le mani che mi fanno vincere
    #region CreoMazzo
    
                Carte[] escludo = new Carte[carte.Length + avversario.Length];
                for (int i = 0; i < escludo.Length; i++)
                {
                    if (i < carte.Length)
                        escludo[i] = carte[i];
                    else
                        escludo[i] = avversario[i - carte.Length];
                }
                Carte[] mazzo = creaMazzo(escludo);
                #endregion
    
                #region Carico
                Carte[] tmp = new Carte[7];
                tmp[0] = carte[0];
                tmp[1] = carte[1];
                Carte[] tmp1 = new Carte[7];
                tmp1[0] = avversario[0];
                tmp1[1] = avversario[1];
                #endregion
                int maniVincenti = 0;
    
                for (int i = 0; i < mazzo.Length; i++)
                {
                    tmp[2] = mazzo[i];
                    tmp1[2] = mazzo[i];
    
                    for (int a = 1; a < mazzo.Length; a++)
                    {
                        tmp[3] = mazzo[a];
                        tmp1[3] = mazzo[a];
    
                        for (int b = 2; b < mazzo.Length; b++)
                        {
                            tmp[4] = mazzo[b];
                            tmp1[4] = mazzo[b];
    
                            for (int c = 3; c < mazzo.Length; c++)
                            {
                                tmp[5] = mazzo[c];
                                tmp1[5] = mazzo[c];
    
                                for (int d = 4; d < mazzo.Length; d++)
                                {
                                    tmp[6] = mazzo[d];
                                    tmp1[6] = mazzo[d];
    
                                    Punti p = calcolaPunto(tmp);
                                    Punti p1 = calcolaPunto(tmp1);
                                    int v = Confronta(p, p1);
                                    if (v == 2 || v == 0)
                                        maniVincenti++;
                                }
                            }
                        }
                    }
                }
    
                return maniVincenti;
            }
    pero è lentissimo perche analizza piu di 200 milioni di mani invece un software che ho visto su internet ne analizzava solo un milione dov'è l'errore
  • Re: [c#]Calcolo probabilita vincita poker

    200 milioni di mani ? E perché mai ?

    Se ho capito bene i giocatori hanno solamente due carte e sul board ci saranno in totale 5 carte ... no? Come mai 200 milioni di mani?
  • Re: [c#]Calcolo probabilita vincita poker

    Perche non mi esclude le mani simili cioè
    12345 e 21345 che sono mani simili le conta entrambe ecco il problema come posso correggere quell'errore
  • Re: [c#]Calcolo probabilita vincita poker

    Continuo a non capire ... fai un esempio concreto

    1 giocatore : A di cuori + K di picche
    2 giocatore : Q di cuori + 8 di quadri

    Board ...

    Quali problemi hai nel calcolo?
  • Re: [c#]Calcolo probabilita vincita poker

    Scusami non riesco a spiegarmi allora io devo calcolare tutte le combinazioni di carte che possono apparire sul bord ad esempio
    AssoCuori KappaCuori 10Picche JeckFiori DueFiori
    questa è una combinazione quest'altra combinazione che quel codice mi calcola
    KappaCuori AssoCuori 10Picche JeckFiori DueFiori

    come vedi è uguale io voglio evitarle
  • Re: [c#]Calcolo probabilita vincita poker

    E quindi devi usare le Combinazioni ... tu come hai calcolato il 200 milioni di mani ... ?
  • Re: [c#]Calcolo probabilita vincita poker

    Si come posso corregere quel algoritmo cosi da evitare le combinazioni simili
  • Re: [c#]Calcolo probabilita vincita poker

    Ripeto la domanda ... l'ultima volta ... come hai calcolato il 200 milioni?
  • Re: [c#]Calcolo probabilita vincita poker

    Nel codice che ho postato avevo aggiunto una variabile che si incrementava all interno del ultimo ciclo alla fine di tutti i cicli me la ritornava e ho potuto vedere che questa ammontava a piu di 200 milioni
  • Re: [c#]Calcolo probabilita vincita poker

    No ... devi usare le combinazioni senza ripetizioni ... nel tuo caso saranno

    52 carte nel mazzo - 4 dei giocatori = 48
    carte da estrarre = 5

    C(48,5) = n! / (k! (n - k)!) = 48! / (5! (48 - 5)!) = 1712304 (poco meno di 2 milioni)
  • Re: [c#]Calcolo probabilita vincita poker

    Forse le chiedo troppo potreppe aiutarmi a creare un ciclo che mi fa gestire tutte quelle combinazioni perche io devo analizzare combinazione per combinazione e non ho idea di come gestire il ciclo
  • Re: [c#]Calcolo probabilita vincita poker

    Non scrivo codice completo nei forum ma fornisco qualche suggerimento (anche come indicato dal regolamento ...) ... e soprattutto perché lo ritengo poco utile per imparare ...

    Vedi di leggere questo esempio in VB6 e cerca di convertirlo in C# ...

    http://marcoggblog.blogspot.it/2011/10/vb6-combinazioni-semplici-e-con.html
  • Re: [c#]Calcolo probabilita vincita poker

    Grazie tantissimo ma ho un problema mentre cerco di convertire online il codice mi da un errore purtroppo non capisco una mazza di Vb e non so come convertirlo
  • Re: [c#]Calcolo probabilita vincita poker

    Sono riuscito a trovare del codice e a riadattarlo
    questo calcola gli indicatori
    
    public static ArrayList calcolaIndici(ArrayList linearSet, int k)
            {
                if (linearSet == null || k > linearSet.Count || k < 0)
                    throw new ArgumentException();
                ArrayList toReturn = new ArrayList();
                if (k == 0) return toReturn;
                int[] indexes = new int[k];
                indexes[0] = 0;
                int i = 0;
                while (i >= 0)
                {
                    while (i++ < indexes.Length - 1)
                        indexes[i] = indexes[i - 1] + 1;
                    ArrayList toAdd = new ArrayList();
                    for (i = 0; i < k; i++)
                        toAdd.Add(indexes[i]);
                    toReturn.Add(toAdd);
                    i = indexes.Length - 1;
                    while (i >= 0 && ++indexes[i] == linearSet.Count - (indexes.Length - i - 1))
                        i--;
                }
                return toReturn;
            }
    
    una volta aggiunti i controlli per vedere se la mano è vincente o meno il tutto ci inpiega circa 10 secondi mentre i programmi che ho visto ci mettono meno di un secondo penso che per velocizzarlo dovrei usare delle matrici di int purtroppo non sono praticissimo delle matrici in c#
Devi accedere o registrarti per scrivere nel forum
14 risposte