Adivinar número más probable falla creo.

Iniciado por Tachikomaia, 22 Febrero 2021, 01:52 AM

0 Miembros y 1 Visitante están viendo este tema.

Tachikomaia

Código (actionscript) [Seleccionar]
Escena 1
   actions for fotograma 1
      N0 = 0;
      N1 = 0;
      N2 = 0;
      N3 = 0;
      N4 = 0;
      N5 = 0;
      N6 = 0;
      N7 = 0;
      N8 = 0;
      N9 = 0;
      MostProbably = 0;
   actions for fotograma 2
      Num = random(10);
      trace ("Num es "+Num);
      set ("N"+Num, eval("N"+Num)+1);
      if (MostProbably < eval("N"+Num)) {
         MostProbably = Num;
      }
      trace ("MostProbably es "+MostProbably);
   actions for fotograma 3
      gotoAndPlay (2);


Por ejemplo en una ejecución:
Num es 4
MostProbably es 4
Num es 7
MostProbably es 4
Num es 6
MostProbably es 4
Num es 9
MostProbably es 4
Num es 7
MostProbably es 4

El 4 apareció sólo 1 vez mientras que el 7 2, pero el más probable no cambió a 7.

EdePC

Tienes un malentendido en tu IF, no debes guardar el Num aleatorio en MostProbably, por ejemplo si te da 4 como en tu código, entonces tendría que generarse al menos 4 veces un Num para que recién pueda cambiar el valor de MostProbably

Lo que si podrías hacer es guardar en MostProbably el nombre de la variable que tenga la mayor cantidad de repeticiones, y acceder al contenido de esa variable usando eval:

Código (actionscript,14,20,21,23) [Seleccionar]
Escena 1

  actions for fotograma 1
    N0 = 0;
    N1 = 0;
    N2 = 0;
    N3 = 0;
    N4 = 0;
    N5 = 0;
    N6 = 0;
    N7 = 0;
    N8 = 0;
    N9 = 0;
    MostProbably = "N0";

  actions for fotograma 2
    Num = random(10);
    trace("Num es " + Num);
    set( "N" + Num, eval("N" + Num) + 1 );
    if ( eval(MostProbably) < eval("N" + Num) ) {
      MostProbably = "N" + Num;
    }
    trace( "MostProbably es " + eval(MostProbably) );
 
  actions for fotograma 3
    gotoAndPlay (2);

nosoy

Ese algoritmo lo que no tiene en cuenta, me parece, es la posibilidad de que haya varios dígitos cuya frecuencia de repeteción es máxima, en lugar de uno solo. Ese caso deberá presentarse cíclcamente si la función random está bien construida, porque la probabilidad teórica de cada dígito es 0.1, y con el crecimiento de pruebas más debe de acercarse la frecuencia de cada dígito a ese teórico 0.1.

Creo que el algoritmo lo que presenta es el nº de aparciones del primer dígito que llega a ese máximo, y luego sigue presetando el mismo dígito (aunque otros dígitos hayan igualado el nº de repeticiones) hasta que es superado por algún dígito que aparezca una vez más.

Si por ejemplo en un momento dado el que más ha salido es el '7' con 14 apariciones, digamos, y de pronto el '1' llega a también a 14 apariciones sigue saliendo el '7' en exclusiva ¿no? O eso creo. Y si otro dígito llega también a las 14 repeticiones seguirá saliendo el '7'; solamente cambiará cuando alguno alcance las 15 repeticiones, y entonces volvera a quedarse en ese nuevo hasta que alguno llegue a 16, y así sucesivamente...

EdePC

Excelente análisis @nosoy, yo me he tenido que leer la referencia del lenguaje AS2.0 para entenderlo completamente.

Por cierto me he encontrado con el Macromedia Flash MX 2004, solo pesa 62MB, también un manual de referencia del lenguaje Action Script 2.0 para Macromedia Flash MX 2004:
https://mega.nz/folder/V1ZRwKZL#H3zOInCBHyewEvT9OZ8gvQ

- Es un programa viejo y sin soporte (AbandomWare), así que no creo que tenga problemas :P

Su depurador puede ser útil para resolver problemas ya que permite ejecutar línea a línea y ver las variables, trace (output), etc

Tachikomaia

Acertaste EdePC, sólo que al final no va eval, sino muestra la cantidad de veces que salió el número, no el número en sí. Agregué más datos a los trace.

Código (actionscript) [Seleccionar]
Escena 1
   actions for fotograma 1
      N0 = 0;
      N1 = 0;
      N2 = 0;
      N3 = 0;
      N4 = 0;
      N5 = 0;
      N6 = 0;
      N7 = 0;
      N8 = 0;
      N9 = 0;
      MostProbably = "N0";
   actions for fotograma 2
      Num = random(10);
      set ("N"+Num, eval("N"+Num)+1);
      trace ("Num es "+Num+" con "+eval("N"+Num));
      if (eval(MostProbably)<eval("N"+Num)) {
         MostProbably = "N"+Num;
      }
      trace ("MostProbably es "+MostProbably+" con "+eval(MostProbably));
   actions for fotograma 3
      gotoAndPlay (2);


Num es 4 con 1
MostProbably es N4 con 1
Num es 6 con 1
MostProbably es N4 con 1
Num es 1 con 1
MostProbably es N4 con 1
Num es 7 con 1
MostProbably es N4 con 1
Num es 5 con 1
MostProbably es N4 con 1
Num es 2 con 1
MostProbably es N4 con 1
Num es 7 con 2
MostProbably es N7 con 2
Num es 5 con 2
MostProbably es N7 con 2
Num es 0 con 1
MostProbably es N7 con 2
Num es 3 con 1
MostProbably es N7 con 2
Num es 2 con 2
MostProbably es N7 con 2
Num es 8 con 1
MostProbably es N7 con 2
Num es 6 con 2
MostProbably es N7 con 2
Num es 6 con 3
MostProbably es N6 con 3
Num es 0 con 2
MostProbably es N6 con 3
Num es 4 con 2
MostProbably es N6 con 3
Num es 1 con 2
MostProbably es N6 con 3
Num es 7 con 3
MostProbably es N6 con 3
Num es 4 con 3
MostProbably es N6 con 3
Num es 9 con 1
MostProbably es N6 con 3
Num es 4 con 4
MostProbably es N4 con 4
Num es 0 con 3
MostProbably es N4 con 4
Num es 9 con 2
MostProbably es N4 con 4


Bien interpretado nosoy.

Cita de: EdePC en 24 Febrero 2021, 13:43 PM
Excelente análisis @nosoy, yo me he tenido que leer la referencia del lenguaje AS2.0 para entenderlo completamente.
¿Qué no habías entendido? ¿eval?

CitarSu depurador puede ser útil para resolver problemas ya que permite ejecutar línea a línea y ver las variables, trace (output), etc
Yo me quedé con el 5 básicamente porque es el único, o el último, en que funciona el comando save, además de poder poner variables en las películas (eso se quitó no sé cuando). Producir archivos exe puede que aún funcione.

https://board.flashkit.com/board/showthread.php?294768-FScommand-help-saving-in-txt-file

nosoy

Como curiosidad pongo un algoritmo en C que no hace exactamente lo mismo, pero parecido. No determina el/los dígito/s que ha/n salido más veces, sino que determina el nº de veces que ha salido cada dígito (para ello usa una tabla unidimensional o array) y la frecuencia relativa de cada uno de ellos. También indica el número total de tiradas o pruebas que se han hecho. Como es un bucle infinito hay que pararlo expresamente con Ctrl+c.

Adjunto también de una imagen a las 10.000 pruebas. Como se ve, con ese número de tiradas ya las frecuencia se aproximan bastante a la probabilidad teórica 1 / 10. Lo que quiere decir que la función rand() de C parece que  se comporta bastante bien cuando el nº de pruebas es alto.

El código está ejecutado sobre Linux; si se ejecuta sobre Windows habría que cambiar la función para borrar pantalla system("clear") por system("cls").

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ()
{
long num_tot; /* nº total de pruebas dígito 0-9 que se han hecho */
long num_veces [10]; /* nº veces que ha aparecido cada dígito */
float frec_relat [10]; /* frecuencia relativa de apariciones de cada dígito */
int digito_azar; /* dígito entre 0-9 para elegir al azar */
int i; /* contador bucle */

num_tot = 0; /* inicialización */
for (i = 0; i < 10; i++)
{ /* de */
num_veces [i] = 0;
frec_relat [i] = 0;
} /* variables */

srand (time(NULL)); /* semilla para rand */

while (1 == 1) /* bucle infinito */
{
system ("clear");

digito_azar = rand() %10; /* se elige dígito al azar entre 0-9 */
printf ("digito_azar = %u\n", digito_azar);

num_tot++; /* se actualiza el nº total de pruebas */

for (i = 0; i < 10; i++) /* se actualiza */
{
if (i == digito_azar)
{ /* el nº de repeticiones */
++num_veces [i];
}
} /* de cada dígito */

for (i = 0; i < 10; i++) /* actualiza frecuencias */
{
frec_relat [i] = (float) num_veces [i] / num_tot;
} /* de cada dígito */

printf ("Nº total de pruebas: %ld\n", num_tot); /* imprime */
for (i = 0; i < 10; i++)
{
printf ("Nº de apariciones de %u", i);
printf (": %ld", num_veces [i]);
printf ("     Frecuencia relativa: %f\n", frec_relat [i]);
} /* resultados */

printf ("pulsar para seguir"); /* espera pulsar */
while (getchar () != '\n') /* pulsar tecla */
; /* para seguir */

}

return 0;
}