MENÚ GO ULTRASOL Y ULTRALUNA POKÉDEX CARTADEX
Λ H V

 



Pokéxperto
487

El RNG

Guías Abuso RNG

Contenido

  1. Explicación
  2. Formas y Usos del RNG
  3. El Valor Inicial "Seed" (Semilla) y el Avance del RNG
  4. Resumen y Conclusiones

Nota: Si desconoces o no controlas el sistema de números binario y hexadecimal, o las operaciones con bits, tal vez te interese revisar primero la guía de Sistemas y Operaciones Numéricos.

1.- Explicación

El RNG o PRNG "Pseudo-Random Number Generator" (GPAN "Generador Pseudo-Aleatorio de Números") es un algoritmo o función que sirve para generar números aleatorios. Entre las características de los PRNG se encuentran que éstos no generan números verdaderamente aleatorios, sino números pseudo-aleatorios dados por secuencias. Estas secuencias son determinadas en un principio por valores iniciales llamados State (Estado), o por un valor inicial llamado Seed (Semilla). Los juegos principales de Pokémon utilizan el método de LCG "Linear Congruential Generator" y en general cuando el RNG es llamado la fórmula utilizada para hallar un número es:

RNG[X] = {(0x41C64E6D * RNG[X-1]) + 0x6073} % 0x100000000;

... donde RNG[X-1] es el valor previo del RNG antes de ser llamado, y ese valor previo a su vez depende de otro valor previo del RNG que en éste caso sería RNG[X-2]. Esto se conoce como función recursiva. El valor de RNG[0] es el llamado valor inicial Seed (Semilla), el cual es determinado por una serie de factores elegidos por el juego, los cuales varían según la versión de éste.

Aspectos Destacables:

La generación de números del RNG no es completamente aleatoria, esto es, la probabilidad de aparición del valor previamente hallado en la próxima llamada es 0 (lo cual no es cierto, por ejemplo, cuando se lanzan dados). El hecho de que esto ocurra y sea utilizado es porque la generación de estos números viene dada por períodos, es decir, que después de X llamadas del RNG, esos mismos números volverán a aparecer con el mismo valor y en el mismo orden.

Según la teoría de LCG, una elección adecuada de los factores del algoritmo hace que el periodo del RNG sea el máximo posible y por tanto lo más aleatorio posible. Ahora bien, sabiendo que esto se cumple para la fórmula descrita anteriormente, podemos concluir que el periodo máximo es de 0x100000000 (4294967296) llamadas en donde todos los números de 0x0 hasta 0xFFFFFFFF (4294967295) son utilizados sin excepción, y que, dado un número cualquiera X de un RNG, habrá sólo un número que corresponda para el RNG de X-1 o X+1 o X±N, donde N es cualquier número pero menor al periodo total.

En base a esto es posible tener una fórmula para el RNG en donde el valor no dependa de un RNG previo, sino de un RNG posterior. La fórmula sería:

RNG[X] = {(0xEEB9EB65 * RNG[X+1]) + 0xA3561A1} % 0x100000000;

Volver al Contenido

2.- Formas y Usos del RNG

En los juegos de Pokémon el RNG no sólo es usado para decidir eventos o sucesos que deben ocurrir de forma aleatoria, sino que también es usando para la protección y verificación de datos RAM, como por ejemplo la comprobación y legalidad de archivos .sav y .pkm. Además, el RNG no solo utiliza la fórmula descrita anteriormente para hallar números aleatorios, también se conoce otra fórmula e incluso otro método.

» En general, la fórmula más utilizada por el RNG, tanto para GBA como para NDS, es:

RNG[X] = {(0x41C64E6D * RNG[X-1]) + 0x6073} % 0x100000000;

De la cual los usos que se conocen son:

  • El encriptado y desencriptado de los datos del Pokémon (.pkm) de los archivos de partidas salvadas (.sav) y en la memoria de los juegos (RAM).
  • La generación del PID de Pokémon encontrados de forma salvaje.
  • La generación de los IVs de Pokémon encontrados de forma salvaje.
  • La generación del PID o los IVs de ciertos Pokémon que no son obtenibles de forma salvaje (por ejemplo, los Pokémon obtenidos en eventos).
  • La determinación de la especie de un Pokémon encontrado de forma salvaje.
  • El número del sorteo de la Lotería.
  • Y en general para cualquier otro valor que el juego necesite hallar de forma aleatoria. Eso si otro método no es utilizado.

» La otra fórmula utilizada, pero solo para NDS, es:

RNG[X] = {(0x6C078965 * RNG[X-1]) + 0x1} % 0x100000000;

De la cual los usos que se conocen son:

  • La determinación de la especie de los Pokémon encontrado en Manadas.
  • La determinación de la especie de los Pokémon encontrados en el Gran Pantano.
  • La determinación de la especie de los Pokémon encontrados en el Jardín Trofeo.
  • Retricción de que el Huevo de Manaphy recibido de Pokémon Ranger sea shiny.
  • Restricción de que los Pokémon recibidos por Tarjeta Misteriosa tipo 1 sean shiny (por ahora aquellos con naturaleza variable).
  • Incremento de probabilidad de que un Pokémon obtenido por crianza de padres que provengan de diferentes idiomas sea shiny (de 1 cada 8192 a 1 cada 2048).

» El otro método que utiliza el RNG es el Mersenne Twister, sólo utilizado en NDS y el cual no se explicará aquí, aunque es posible encontrar información bien detallada acerca de su implementación. El uso conocido de éste método (llamado IRNG "Incubator RNG") es únicamente el de la generación del PID para Pokémon obtenidos por crianza.

Volver al Contenido

3.- El Valor Inicial Seed y el Avance del RNG

Para que el RNG pueda comenzar con la generación de números, primero se debe hallar un valor inicial con el cual pueda trabajar. Ese valor es el que se conoce como Seed (Semilla), el cual tiene distintas formas de asignación para los distintos juegos de Pokémon. A continuación se muestra ésta información:

Juego Asignación del Seed
Rubí El valor depende del tiempo que lleva el reloj interno del juego.
Zafiro
Rojo Fuego El valor depende del tiempo que se lleva en la pantalla inicial del juego hasta que se inicia con la partida salvada.
Verde Hoja
Esmeralda El valor comienza con 0 cada vez que se comience o se reinicie el juego.
Diamante El valor depende de la fecha interna del juego (y del reloj) y del tiempo que se demora el jugador en la pantalla inicial. La fórmula exacta para determinar el valor es:

Semilla = [{(Mes * Día + Minutos + Segundos) % 0x100} * 0x1000000] + (Horas * 0x10000) + (Ańo - 2000 + Retraso);

Donde:

  • Ańo va desde 2000 hasta 2099.
  • Mes va desde 1 hasta 12.
  • Día va desde 1 hasta 31.
  • Minutos va desde 0 hasta 59.
  • Segundos va desde 0 hasta 59.
  • Retraso: Es el tiempo en segundos (multiplicado por 60 aproximadamente) que se demora el jugador desde que inicia o reinicia el juego hasta que presiona "A" en el menú para "Continuar".
Perla
Platino
Oro HeartGold
Plata SoulSilver

Ahora bien, el RNG no sólo es llamado cuando se le necesita estrictamente. Hay ciertas situaciones que provocan el avance del RNG, que cambie su estado. Estos efectos también dependen de la versión del juego. A continuación se muestra dicha información:

Juego Formas de Avance del RNG
Rubí Pendiente.
Zafiro
Rojo Fuego Pendiente.
Verde Hoja
Esmeralda El RNG avanza constantemente unas 60 veces por segundo, aproximadamente. A diferencia de DPPt, las acciones en el juego no tienen un efecto en este avance.
Diamante El avance del RNG depende de acciones específicas que se llevan a cabo en el transcurso del juego. A continuación se presentan las acciones que hacen avanzar el RNG, aunque la información podría no ser del todo precisa:

En Zonas de Pokémon Salvajes (Hierba, Agua, Cueva):

  • Cuando el personaje camina en línea recta, el RNG avanza en 1 por cada paso.
  • Cuando el personaje se gira (90 o 180 grados), el RNG avanza en 1 por cada giro.
  • » El caminar y el girar al mismo tiempo se toma como acciones separadas, por lo que el RNG avanzaría en 2. El uso de Repelente no tiene efecto en el avance.

  • Cuando se usa Dulce Aroma en la hierba o en una cueva, el RNG avanza en 1.
  • Cuando se usa Dulce Aroma en el agua, el RNG avanza en 2.
  • Cuando hay un encuentro aleatorio de un pokémon salvaje, el RNG avanza en 1.
  • Nota: Este tipo de avance es diferente al que sucede cuando se decide la especie del pokémon o cuando se entra en batalla. Además, combatir hace bastantes llamadas al RNG, pero parece que estas llamadas se desarrollan después del combate y por ello después de generar el PID y los IVs del Pokémon contra el que luchaste.
  • Cuando se está pescado y no se ha tenido suerte ("Hoy no pica..."), el RNG avanza en 1. Cuando se ha tenido suerte pero se deja escapar el Pokémon ("El Pokémon se ha escapado..."), el RNG avanza como si se hubiera encontrado el pokémon.

En Cualquier Lugar:

  • Cuando se dan 128 pasos, el RNG avanza de 1 a 6 según el número de pokémon que hay en el equipo. El contador de pasos queda guardado cuando se salva la partida.
  • Cuando un personaje distinto al jugador (NPCs: "Non-Player Characters") camina o se gira, el RNG avanza en 1 por cada acción. Esto ocurre incluso si el personaje no es visible en la pantalla pero está en la misma zona. Los personajes que se mueven con un patrón determinado (por ejemplo los que se mueven en círculos) no se tiene en cuenta para el avance.
  • Cuando se abre el Diario (también cuando se abre automáticamente al continuar la partida) o cuando se cambia de página en el Diario, el RNG avanza en 2 si en esa página aparece alguno de los siguientes textos (PXP es el nombre de cualquier especie de Pokémon):

    • 'Capturé un PXP macho/hembra.'
    • 'Capturé un PXP (día/tarde/noche).'
    • 'PXP fue capturado (día/tarde/noche).'
    • 'Vencí a un PXP macho/hembra.'
    • 'Vencí a un PXP (noche).'

Otros Factores:

  • Por cada pokémon que esté vagando por todas las rutas del juego (Roaming Pokémon), el RNG avanza al inicio en 1 cuando se continúa la partida. Los pokémon de éste tipo son: Mesprit, Cresselia, Articuno (en Pt), Zapdos (en Pt) y Moltres (en Pt).

Avance del IRNG:

El IRNG es independiente del RNG principal, éste no avanza con las acciones anteriormente descritas, pero el valor de Semilla es igual para ambos cuando se inicia la partida. Las acciones que hacen avanzar al IRNG son:

  • Lanzar la moneda en la aplicación del Poké-reloj Lanzamonedas (# 15) avanza el IRNG en 1.
  • Hacer saltar a los pokémons del equipo en la aplicación del Poké-reloj Indicador Amistad (# 6) (para hacer esto, hay que dar dos toques rápidos en algún lugar de la pantalla donde no haya pokémons) avanza el IRNG en un número igual a la cantidad de pokémons que se tenga en el equipo multiplicado por dos.
  • Solo cambiar a la aplicación Indicador Amistad del Poké-reloj hace avanzar al IRNG igual a como se mencionó anteriormente.
  • Iniciar la partida teniendo seleccionada la aplicación Indicador Amistad del Poké-reloj hace avanzar al IRNG igual acomo se mencionó anteriormente.
  • Tener un huevo creado en la guardería avanza el IRNG en 1 (es la llamada para crear el PID del huevo).
  • Ir a un cambio por Wi-Fi restaura el IRNG a un valor desconocido.
  • Ir a un cambio en la Sala Unión restaura el IRNG a un valor desconocido.

Perla
Platino
Oro HeartGold Al igual que en DPPt, solo acciones específicas hacen avanzar el RNG, pero hay ciertas diferencias. Aunque aun se puede hacer más investigación, las acciones que se han podido encontrar y comprobar son:

En Zonas de Pokémon Salvajes (Hierba, Agua, Cueva):

  • Cuando el personaje del jugador camina en línea recta o se gira, el RNG puede avanzar en 1, 2 o nada, aun no es sabido bajo qué condiciones pasa esto.

  • Usar Dulce Aroma avanza el RNG en 1 si se está montado en la Bici, usarlo teniendo un pokémon siguiéndote lo hace avanzar de forma inesperada.

En Cualquier Lugar:

  • Llamar al Prof. Elm desde el PokéGear avanza el RNG en 1 SI:
    1. Se le ha mostrado a él el Togepi que sale del huevo que se recibe en Ciudad Malva.
    2. Se ha llegado a Kanto.
    3. Algún pokémon ha contraído el Pokérus y se le lleva éste a una enfermera de algún centro Pokémon.

  • Llamar al Joven Chano (Youngster Joey) desde el PokéGear avanza el RNG por 2, pero solo si este no responde para pelear de nuevo.

  • Cambiar de canal en el radio del PokéGear puede hacer avanzar el RNG, el cuanto y como depende de la programación del canal:
    1. La Hora de Oak (Pokemon Talk): De 14 a 18 veces, avance incierto.
    2. Música Pokémon (Pokemon Music): Algunas veces 1 o ninguno, avance incierto.
    3. Canal Pueblos, Canal Perfiles (That Town, These People): 3 veces, avance incierto.
    4. Series Radiofónicas (Silver Drama): 1 Avance.
    5. Buscadores Pokémon (Pokémon Search Party): 1 Avance.
    6. La contraseńa de Buena (Buena's Password): Ningún avance. El programa aparece las horas: 2 AM, 5 AM, 8 AM, 11 AM, 2 PM, 5 PM, 8 PM, y 11 PM, el resto de horas aparecen los dos programas anteriores.
    » El avance solo ocurre si la radio tiene seńal (se excluyen cuevas o lugar de Ho-Oh y Lugia no tiene seńal).

Otros Factores:

  • Entrar o salir de la Torre Oculta (Embedded Tower), lugar donde se encuentra Kyogre, Groudon y Rayquaza, hace avanzar el RNG en 1.

  • Por cada pokémon deambulante (Roaming Pokémon), el RNG avanza al inicio en 1 o en 2, el valor específico depende del valor de la Semilla. Los pokémon de este tipo son: Raikou, Entei, Latias y Latios; Suicune NO es un pokémon de este tipo.

Avance del IRNG:

Hasta el momento no hay una acción conocida que haga avanzar el IRNG, salvo crear un huevo en la guardería (para lo único que es necesitado el IRNG), lo cual lo avanza en 1.

Plata SoulSilver

Volver al Contenido

4.- Resumen y Conclusiones:

Si sabemos cómo se usa el RNG en Pokémon y sus diferentes formas, y además sabemos cómo es inicializado y cómo avanza en el tiempo y bajo qué condiciones, podemos utilizar esto a nuestro favor, ya que lo aleatorio dejará de serlo si podemos anticipar sus pasos.

Un ejemplo de ello es lo que se conoce como "RNG Abuse". Se trata de una guía para obtener pokémon con las características que deseemos de forma totalmente natural siguiendo una serie de pasos que permiten "guiar" al RNG para que se cumpla. Seria algo así como "eliminar la suerte" y permitir al usuario que el tiempo que invierte en conseguir pokémon con unas características específicas sea mucho menor.

Volver al Contenido

5.- Ejemplo:

» Para entender como el RNG calcula números pseudo-aleatorios con la fórmula principal, vamos a averiguar el valor del X RNG si el valor de del X-1 RNG es de 0xA7BB009E.

Siguiendo la primera fórmula tendremos:

  1. RNG[X-1] es igual a 0xA7BB009E (2814050462).
  2. El valor de multiplicar RNG[X-1] por 0x41C64E6D (1103515245) es: 0xA7BB009E * 0x41C64E6D = 0x2B18692CFD036746.
  3. Sumando el valor anterior con 0x6073 (24691) tenemos: 0x2B18692CFD036746 + 0x6073 = 0x2B18692CFD03C7B9.
  4. Y realizando módulo 0x100000000 (4294967296) con el resultado anterior nos da (es decir, cogemos únicamente los primeros 32 bits (4 bytes) menos significativos del número): 0x2B18692CFD03C7B9 % 0x100000000 = 0xFD03C7B9.

Y tenemos que el valor de RNG[X] es 0xFD03C7B9 (4244883385) si el valor de RNG[X-1] fue 0xA7BB009E.

Si hacemos el cálculo 3 veces más tendremos que tener los siguientes valores:

  • RNG[X] = 0xFD03C7B9.
  • RNG[X+1] = 0x538CC838.
  • RNG[X+2] = 0x8B42B04B9.
  • RNG[X+3] = 0x021E4A62.

» Ahora que si queremos calcular no los valores posteriores, sino valores anteriores del RNG, podemos utilizar la fórmula inversa del RNG y calcular el valor que tuvo el X-2 RNG para el ejemplo anterior.

Siguiendo la segunda fórmula tendremos:

  • RNG[X-1] es igual a 0xA7BB009E (2814050462).
  • El valor de multiplicar RNG[X-1] por 0xEEB9EB65 (4005161829) es: 0xA7BB009E * 0xEEB9EB65 = 0x9C69AAF12C864856.
  • Sumando el valor anterior con 0xA3561A1 (171270561) tenemos: 0x9C69AAF12C864856 + 0xA3561A1 = 0x9C69AAF136BBA9F7.
  • Y realizando módulo 0x100000000 (4294967296) con el resultado anterior nos da (es decir, cogemos únicamente los primeros 32 bits (4 bytes) menos significativos del número): 0x9C69AAF136BBA9F7 % 0x100000000 = 0x36BBA9F.

Y tenemos que el valor de RNG[X-2] fue 0x36BBA9F7 (918268407) si el valor de RNG[X-1] es 0x36BBA9F7.

Si hacemos el cálculo 2 veces más tendremos que tener los siguientes valores:

  • RNG[X-1] = 0xA7BB009E.
  • RNG[X-2] = 0x36BBA9F7.
  • RNG[X-3] = 0x5CC42D14.
  • RNG[X-4] = 0xE4708685.

Volver al Contenido


żSigues teniendo dudas después de haber leído la guía?, żcrees que has encontrado un error y deseas comentarlo?, prueba a preguntar o informar de esto en los Foros de Pokéxperto, en el Tema Oficial, pero primero léete las reglas del foro.

Revisado el 21 de junio de 2010 a las 13:58

 

Riolu