11 votos

¿Cuál es la probabilidad de conseguir yahtzee?

¿Cuál es la probabilidad de obtener un yahtzee utilizando $N$ dados con $X$ lados en $Y$ lanza en una sola ronda?

El lado del dado que aparezca en el yahtzee con no importa (es decir, no importa si tiro unos, o dos, etc.). También asumo que se utiliza la estrategia perfecta; es decir, después de cada lanzamiento, se guarda el número en el que han caído más dados (en caso de empate, se elige al azar).

1 votos

@runaros: ¿Podrías explicar el juego, qué significa "conseguir yahtzee"?

1 votos

Tirar cinco o seis dados e intentar obtener varias combinaciones de esos dados. Tres lanzamientos cada ronda (pero algunas variaciones de las reglas permiten guardar los lanzamientos para rondas posteriores), y puedes elegir cuántos dados volver a lanzar entre lanzamiento y lanzamiento. es.wikipedia.org/wiki/Yahtzee

0 votos

@runaros: Esperaba que editaras la pregunta en sí. Solo tú y nuestros moderadores (y usuarios con muchos puntos) tenéis esa opción.

7voto

pix0r Puntos 17854

Lo que sigue es una solución a un problema más pequeño; no tengo una buena manera de determinar las probabilidades de que exactamente k de algún tipo sea la mayor cantidad de cualquier tipo en la primera tirada, pero el trabajo que sigue podría usarse desde ese punto para obtener una respuesta.

Sea $f(N,X,Y)$ es la probabilidad de obtener todos los 1s con N dados, cada uno con X caras, en un máximo de Y tiradas, donde después de cada tirada, se retienen los 1s y sólo se vuelven a tirar los dados que no son 1s. Trabajando con 1 tirada cada vez, la primera tirada podría tener exactamente $k=0,\dots,N$ 1s. La probabilidad de exactamente k 1s en una sola tirada es ${N\choose k}\left(\frac{1}{X}\right)^k\left(\frac{x-1}{x}\right)^{N-k}$ y teniendo k 1s en la primera tirada, necesitamos entonces $N-k$ 1s en el resto $Y-1$ rollos. Así que.., $$f(N,X,Y)=\sum_{k=0}^{N}{N\choose k}\left(\frac{1}{X}\right)^k\left(\frac{x-1}{x}\right)^{N-k}f(N-k,X,Y-1).$$ Además, la probabilidad de todos los 1s en los dados 0 es 1 (0 de los dados 0 tienen garantizado el 1), por lo que $f(0,X,Y)=1$ y la probabilidad de todos los 1s en $N\ge 0$ dados en 0 tiradas es 0 (no se puede obtener ningún 1 sin tirar algún dado), por lo que $f(N,X,0)=0$ para $N\ge 0$ . Esta es una definición completa de $f(N,X,Y)$ aunque no se presta a un cálculo fácil. (Sin embargo, software como Mathematica puede ser capaz de calcular a partir de esta definición. En Mathematica: f[n_, x_, y_] := If[n == 0, 1, If[y == 0, 0, Sum[ Binomial[n, k]*(1/x)^k*(1 - 1/x)^(n - k)*f[n - k, x, y - 1], {k, 0, n}]]] .)

1 votos

Buena respuesta. Voy a upvote una vez que tenga suficiente rep, y probablemente aceptarlo después de algún tiempo también :)

0 votos

Muy buena solución.

2voto

Flatlineato Puntos 226

Según Wikipedia "la probabilidad de un Yahtzee para cualquier giro de tres rodillos es de aproximadamente 0,04603 (o $\frac{347897}{7558272}$ ), o aproximadamente 1 de cada 22 intentos".

1voto

JeffV Puntos 160

No es una respuesta completa a tu pregunta, pero al menos es una forma cerrada. Para 5 dados normales (de 6 caras), la probabilidad exacta de conseguir un yahtzee, siguiendo la estrategia óptima, dada $n$ rollos es

$1+\frac{53}{13} \left(\frac{5}{6}\right)^{2n+1}+\frac{11 \cdot 5^n}{13 \cdot 2^{n+5} \cdot 3^{3n+1}} -\frac{5^n}{8 \cdot 3^{2n-2}} -\frac{7 \cdot 5^{n+1}}{ 2^{n+5} 3^{n-1}} $

Por ejemplo, fijar $n=3$ da $\frac{347897}{7558272}$ .

1voto

cmmndy Puntos 3280

No puedo darle una respuesta analítica, pero esta pregunta pedía a gritos ser programada. Ahora lo siento que no he utilizado Matlab ( que sería mucho menos código ) pero lo implementé en c ++. El código es simplemente sus reglas implementadas en mi no tan bueno c++. Usé g++ 4.6.3 en Ubuntu 12.04. Si ejecutas el código, imprimirá los resultados y también escribirá los pares (número de dados | número medio de lanzamientos) en out.txt. El resultado se muestra adjunto, trazado con gnuplot para el número de dados $\leq$ 40.

Consulte aquí los resultados como no se mucho de gnuplot y no podia subir un .ps a MathSE tuve que subirlo ahi. Para cada número de dados se han hecho 10000 experimentos. El código es probablemente terriblemente lento así que siéntanse libres de mejorarlo ;)

Aquí hace el mismo cálculo para el número de dados $\leq 400$ pero sólo 1000 experimentos cada uno.

Quizás puedas usar esto para variar alguna de las fórmulas.

yahtzee.cpp:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <vector>
#include <fstream>

using namespace std;

int hasYourNumber(vector<int>,int );
int sum(int* ,int );
int mostFrequent ( vector<int> );
vector<int>throwDice(int);
int role();
void playYahtzee(int,int,bool);

int main ( void ) {

    int REP = 10000; // Number of repeting the experiment
    bool echo = 0;    // print information (yes 1,no 0)
    for (int numberOfDices=1;numberOfDices<40;numberOfDices++){
        playYahtzee(numberOfDices,REP,echo);
    }

    return 0;
}

void playYahtzee(int N,int REP,bool echo){// N dices with 6 faces each;

    srand( time(NULL) );        // initialize random generator  
    int* throws = new int[REP]; // save number of throws for each experiment
    vector <int> dices;     // save dices that came up in one throw inside this, vector just for size(), my way...

    for (int k = 0;k<REP;k++){
        bool first = true;      // is it the first throw?
        int AmountOfYourNumber = 0;     // how often as our number occured
        int yourNumber = -1;        // whats your number
        int numberOfThrows = 0;     // how often have we been throwing in this round
        while (AmountOfYourNumber<N){   // finish if our number has occured N times
            numberOfThrows++;
            dices.clear();
            dices = throwDice(N-AmountOfYourNumber); // place random integers between 1 and 6 inside
            if (first){
                yourNumber = mostFrequent(dices);// choose the most frequent number
                AmountOfYourNumber += hasYourNumber(dices,yourNumber); // how often has it your number
                first = false;
            }else{
                AmountOfYourNumber += hasYourNumber(dices,yourNumber);
            }
            if (echo){ // some output mostly for debugging
                printf("Your number is %d and it has occured %d times in throw 1 to %d.\n", 
                        yourNumber, AmountOfYourNumber,numberOfThrows);
                printf("\tNumbers in this throw:\n\t");
                for (int i=0;i<dices.size();i++) printf("%d\t",dices[i]);
                printf("\n \n");
            }
        }

        throws[k] = numberOfThrows; // save number of throws
    }   

    double avg = double(sum(throws,REP))/double(REP);   // calculate average
    printf("Average number (over %d repetitions) of attempts, when playing with %d dices equals  %g\n",REP,N,avg);
    ofstream output;
    output.open ("out.txt",fstream::app);
    output << N << " " << avg<< endl;
    output.close();
}
int sum(int* throws,int N){ // = sum_i throws[i]
    int s = 0;
    for (int i=0;i<N;i++) s+= throws[i];
    return s;
}
int hasYourNumber(vector<int> dices,int yourNumber){ // calculates how often yournumber is in dices
    int N = 0;

    for (int i=0;i<dices.size();i++){
        if ( dices[i] == yourNumber) N++;
    }
    return N;
}

int mostFrequent ( vector<int> dices){ // which is the most frequent number, takes first best
    int freq [6] = {0,0,0,0,0,0};
    for (int i=0;i<dices.size();i++){
        freq[dices[i]-1]++;
    }
    int yourNumber = -1;
    int max = 0;
    for (int i=0;i<6;i++){
        if (freq[i]>max) {yourNumber = i+1 ; max = freq[i];}
    }
    return yourNumber;
}

vector <int> throwDice(int M){ // throws M dices
    vector <int> dices;
    for (int i=0;i<M;i++) dices.push_back(role());
    return dices;
}
int role(){ // throws one dice
    return rand() % 6 +1;
}

-1voto

user111236 Puntos 2

Las probabilidades son de 1 entre 1.296 con cinco dados de seis caras debido a esta frase matemática: 1*1/6*1/6*1/6*1/6. Además, para obtener un Yahtzee, el primer número de un dado tiene que ser igual a los demás números de los otros dados.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X