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;
}
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.
0 votos
Empiezas tirando N dados, obtienes Y tiradas, en cada tirada menos en la primera puedes elegir guardar los resultados de algunos de los dados y sólo tirar el resto. Un yahtzee es cuando al final de una tirada, todos los dados (los tirados y los guardados de tiradas anteriores) muestran el mismo número.
0 votos
@runaros ¿quieres decir en una sola ronda (con rerolls permitido en una ronda) o en el transcurso de todo el juego? En el segundo caso tenemos que hablar de estrategia :/
0 votos
@Tom: Lo siento, pensaba que el juego era tan común que "todo el mundo" lo conocía. Supongo que no es el caso. He incluido un enlace en la pregunta. @yohay: Buena explicación. @BBischof: Me refería en una sola ronda, con la posibilidad de usar rerolls guardados de rondas anteriores (de ahí la parte Y de la pregunta en lugar de la 3 estándar). Editado la pregunta para aclararlo.