El cerebro humano, por su propia naturaleza, es muy pobre para evaluar la probabilidad de ocurrencia de eventos aleatorios, en base a una calificación numérica dada. Y bastante bueno basado en calificaciones de calidad. Y todo porque una persona hace mentalmente la conversión de probabilidades numéricas en estimaciones cualitativas, y lo hace de manera muy subjetiva:
- 80% de un tiro en el juego, bueno, este es un golpe casi garantizado;
- El 80% del hecho de que su compañero al menos algún día paga una deuda es no-no-no, no funcionará, esto es demasiado riesgo;
- El 5% recibió daño crítico, él es el PNJ del enemigo; es poco probable que se pueda ignorar el riesgo;
- 1% de riesgo de que se caigan los carámbanos si caminas bajo el techo con carámbanos que gotean a un metro de altura; además, es mejor moverse al otro lado de la acera;
- 51% de posibilidades de ganar un mini-juego en un gran juego de rol: puede esperar que después de 20 apuestas gane un poco o al menos me quede con el mío ... después de 20 apuestas ... ¿cómo podría suceder que perdiera la mitad de mi apuesta? oro? ¡Aquí el generador de números aleatorios está claramente roto!
Las siguientes preguntas serán consideradas en el artículo:
- supuestos erróneos en la estimación de probabilidades;
- ejemplos específicos de conceptos erróneos del jugador y probabilidades reales de eventos "raros";
- generador de números aleatorios (generalmente pseudoaleatorio);
- primeros generadores de números pseudoaleatorios simples que usan Final Fantasy I como ejemplo;
- enfoques para la implementación de eventos aleatorios con reproducibilidad y sin;
- ejemplos de diferentes enfoques y manipulaciones implementados con éxito en Fire Emblem.
Supuestos erróneos en la estimación de probabilidades.
En el proceso de evolución, el cerebro humano aprendió a funcionar muy bien con evaluaciones cualitativas de eventos e imágenes de su experiencia. A una persona se le ocurrieron números y una estimación numérica abstracta de la probabilidad de eventos "aleatorios" relativamente recientemente [
1 ]. Sin embargo, las personas en sus estimaciones seguirán convirtiendo estos números en representaciones cualitativas: un poco, un poco, mucho, peligroso, seguro, suficiente.
Estas evaluaciones siempre dependen del contexto y la actitud subjetiva hacia este contexto. Esta es precisamente la causa principal de los supuestos numéricos erróneos.
Como ejemplo, se considerará el juego por turnos Disciples 2 [
2 ]. Esta parte del artículo no considerará la calidad de la generación de números aleatorios específicamente en este juego. Habrá suficientes datos sobre su generación en la segunda parte del artículo.
Discípulos 2 - Señorita típica [ 2 ]Un ataque cuerpo a cuerpo estándar tiene un 80% de probabilidad de golpear. Por lo general, el jugador percibe esta posibilidad como "
casi siempre ", y el riesgo de una falla es "
ocasionalmente / ocasionalmente ". La posibilidad de fallar 2 veces seguidas con dos ataques es del 4%. El jugador percibe este riesgo como "
casi nunca / esto ocurrirá extremadamente raramente ". Y cuando esto sucede, los jugadores se indignan con la "curva aleatoria": [
3 ]; [
4 ]
Pero en situaciones con dos fallas consecutivas y una evaluación de riesgo del 4%, una evaluación rápida del jugador tiene varias suposiciones erróneas:
1.
4% no es " casi nunca " . Este es un evento que ocurrirá en cada 25o experimento independiente (en promedio).
2.
La evaluación se lleva a cabo en el intervalo de tiempo incorrecto . El intervalo mínimo de medición de ataque del 80% debe tomarse no 2 ataques, sino todos los ataques de la misma clase (~ 80%) durante la memoria del jugador "cauteloso". La mayoría de las veces, durante este tiempo, puede tomar una sesión de juego larga o todo el juego en general, todo depende del tipo de juego, la memoria del jugador y las preferencias del jugador.
Como no tengo estadísticas reales sobre el uso de este juego, procederé de la suposición de que una sesión de juego larga en Disciples 2 dura 3 horas y durante este tiempo se realizan alrededor de 250 ataques con una precisión de ~ 80%. Vale la pena señalar que las fallas enemigas deben ignorarse, porque Si falla, el jugador no está enojado y rara vez los recuerda.
Por lo tanto, la situación debe evaluarse: "Para los 250 ataques, 2 errores seguidos nunca sucederán".
Para calcular la probabilidad de la verdad de este evento, se utilizó la fórmula de recurrencia: P1 (n) = 0.8 * P1 (n-1) + 0.16 * P1 (n-2). Al obtener esta fórmula, aproveché la ayuda de la comunidad, una cita de los cálculos, los detalles y el resultado se dan a continuación.
Puedes intentar usar la inducción. Introducimos alguna notación. La probabilidad de retener la pata después de la enésima salida se denota por P (n). Representamos esta probabilidad como la suma de dos probabilidades
P (n) = P1 (n) + P2 (n), donde P1 (n) es la probabilidad de que la salida n-ésima sea exitosa, y P2 (n) - no tuvo éxito.
Puede parecer que P1 y P2 son proporcionales a 0.8 y 0.2, pero esto no es así. Debido al hecho de que no estamos considerando ningún resultado posible, sino solo aquellos que han salvado la pata de mapache.
Ahora intentemos derivar una fórmula de recurrencia
P1 (n) = 0.8 * (P1 (n-1) + P2 (n-1))
P2 (n) = 0.2 * P1 (n-1)
Sustituye P2 en la fórmula de P1 que obtenemos
P1 (n) = 0.8 * P1 (n-1) + 0.16 * P1 (n-2)
Solución adicional de las relaciones de recurrencia [5]
Cita del usuario Serbbit [ 6 ]Para resolver el problema, en lugar de comprender los métodos para resolver las relaciones de recurrencia, se escribió un pequeño código javascript para la consola del navegador y se calculó el resultado.
var P1 = []; P1[0] = 1; P1[1] = 1; for (var n=2; n<=250; n++) { P1[n] = 0.8 * P1[n-1] + 0.16 * P1[n-2]; console.log(n + ') ' + P1[n]); }
La respuesta es: 0.0001666846271670716
O
0,0167%Esta respuesta coincide con la respuesta de otro autor Kojiec9: 0.000166684627177505 [
6 ], quien usó su método desarrollado con un sistema numérico de cinco decimales y calculó el resultado usando su fórmula en Pascal. Las diferencias menores en las respuestas se explican, aparentemente, al redondear los números flotantes.
Entonces, en 3 horas de jugar Disciples 2, un jugador tiene la oportunidad de evitar una doble falta con una precisión del 80% a solo
0.0167% . Ahora esto es realmente muy poco probable. (y la probabilidad de
al menos una doble falta es del
99.9833% , respectivamente).
Un aumento en la probabilidad de al menos una doble falla con un aumento en el número de experimentosSobre la imperfección y las distorsiones de la memoria humana, por cierto, en general, existen estudios completos y libros: “Ilusiones del cerebro. Distorsiones cognitivas debido a un exceso de información ”[
7 ]; “No le creas a tu cerebro” [
8 ], si estás interesado en este tema, te recomiendo que comiences a familiarizarte con estos artículos.
3. La tercera suposición incorrecta es la
expectativa de dependencia en experimentos mutuamente independientes .
Es decir, después de la primera falta, el jugador piensa:
“Entonces, el personaje falló con una precisión del 80%. Ahora definitivamente golpeará, porque el riesgo de una doble falla es solo del 4% ".
Pero no Después de la primera falla, el riesgo de otra falla también será del 20%. Después de todo, el ataque pasado ya ha sucedido y no afecta el tiro futuro. Además, si antes del primer ataque la probabilidad de una doble falla era del 4%, luego de la primera falla la probabilidad de una doble falla ya es del 20%, es decir, en relación con las expectativas del jugador, el riesgo solo aumenta.
Esta característica del cerebro humano es especialmente atractiva para las manipulaciones del casino (y similares) en los juegos de azar (más sobre el dispositivo de las máquinas tragamonedas del fabricante [
9 ]).
Se pueden encontrar ejemplos más interesantes de los delirios del cerebro humano en artículos sobre el equilibrio de Jan Schreiber "Nivel 5: Probabilidad y aleatoriedad que se volvieron horriblemente incorrectos" (
Nivel 5. La probabilidad y la aleatoriedad se hicieron pedazos ) [
10 ].
II Generador de números aleatorios
El término "generador de números aleatorios" (RNG / generador de números aleatorios) utilizado en los juegos casi siempre significa "generador de números pseudoaleatorios" [
11 ]. La característica principal de este generador es su reproducibilidad. La reproducibilidad significa que, conociendo el elemento generador inicial (o semilla), siempre se obtendrá la misma secuencia de
números aleatorios (
pseudoaleatorios ). En algunos juegos, este efecto se manifiesta en el hecho de que después de reiniciar el juego, la secuencia de aciertos y errores no se modifica. Pero en otros juegos no permanece igual.
Y la cuestión es cómo se usa este generador de números pseudoaleatorios y qué objetivos de diseño persigue el desarrollador.
Para comprender mejor el principio de funcionamiento del generador de números pseudoaleatorios, podemos considerar la forma en que se implementa en los primeros juegos clásicos, cuando los recursos de las computadoras (y consolas) estaban especialmente limitados. (Para obtener una
descripción detallada de los ejemplos y sus características, consulte el artículo "Cómo los juegos clásicos hacen un uso inteligente de la generación de números aleatorios" [ 12 ] )
.Cómo los juegos clásicos hacen un uso inteligente de la generación de números aleatorios [ 12 ]Final Fantasy utilicé varias tablas con números fijos predefinidos con 256 valores en cada tabla:
- Para calcular batallas aleatorias con cada paso en el mapa del juego, el algoritmo se movió alrededor de la mesa, cambiando el índice en 1 a la vez, desplazándose gradualmente a través de todos los valores posibles, tanto el hecho de la colisión como un posible grupo de oponentes dependían de ello;
- Para calcular los resultados de la batalla, también se usó una tabla similar de 256 valores fijos, pero avanzar no solo con cada uso posterior del número pseudoaleatorio, sino también cada 2 cuadros. Es decir, cada 2 fotogramas, el algoritmo desplazó ociosamente la tabla con números, reduciendo así el riesgo de secuencias idénticas predichas. La fuente de entropía aquí fue la incertidumbre de cuánto tiempo pensaría el jugador antes de elegir el próximo equipo.
Final Fantasy I utiliza el número de serie (índice) de un valor fijo en la tabla como un grano (generatriz). Es decir, sabiendo el lugar desde el cual se seleccionarán más números aleatorios, se puede predecir con precisión qué número aleatorio se emitirá después de 1000 cheques. En algoritmos de generación de números pseudoaleatorios más complejos, el grano no se usa tan fácilmente, pero el principio básico y el efecto permanecen.
Ahora, para la generación de números pseudoaleatorios, se utilizan principalmente bibliotecas estándar de lenguajes de programación utilizados. La hora actual del sistema se usa con mayor frecuencia como fuente de entropía. Para las necesidades de la industria del juego, las características de las bibliotecas estándar suelen ser suficientes. Los inconvenientes del generador y la fuente de entropía son raramente utilizados por los jugadores debido a la complejidad de su cálculo y manipulación. Por lo general, esto sigue siendo la gran cantidad de programadores de speedraner (
por ejemplo, pirateando la lógica de Pokemon Colosseum [ 13 ] ), lo que significa que los desarrolladores son más sabios para ignorar tales sutilezas.
III. Diferentes enfoques para usar el generador
1. El grano se fija en el momento del inicio de la misión o campaña del juego.Consecuencias para el jugador : recargar el juego no cambiará el hecho de una falta del personaje (llamémosle
loco Fidel ), incluso si la probabilidad de su golpe es del 99%. Sin embargo, antes de intentar golpear, el jugador puede realizar alguna otra acción que use un número aleatorio, por ejemplo, se asemeja a otro personaje: el
calvo Mick . Como resultado de esto, el número aleatorio desafortunado será utilizado por el calvo Mick, y el siguiente número aleatorio en la secuencia se usará en el loco Fidel, entonces probablemente lo obtendrá.
¿Cómo puede abusar un jugador ? : si un disparo con una precisión del 50% resulta en una falla, puede reiniciar y probar el ataque con una precisión ligeramente mayor (55%) hasta que golpee. Después del golpe, guarda y repite esto con otros lanzamientos.
Consecuencias positivas para el desarrollador :
1) El juego se puede reproducir paso a paso, si solo se almacenan el estado inicial, el grano y la secuencia de acciones. Gracias a esto, es posible mostrar repeticiones e incluso almacenar de forma muy compacta los archivos guardados. El método le permite ahorrar mucho espacio en el disco / memoria.
2) Protección del juego interno para que guardar / cargar no permita al jugador llevar a la bancarrota a todos los oponentes NPC encontrados.
Un ejemplo :
El juego roguelike Brogue [
14 ] utiliza este método, comenzando con la generación del mundo del juego y terminando con un error de cálculo de todas las acciones del jugador. Como resultado de esto, solo el grano inicial y la secuencia de comandos del juego se almacenan en el archivo de guardar. Una ventaja adicional de este efecto es que el juego puede iniciarse con el número de grano seleccionado, después de seleccionar el mundo más interesante en las tablas de los mundos Brogue generados [
15 ].
Brogue roguelike - Sitio oficial [ 14 ]2. El grano no se repara o actualiza cada vez que se reinicia.Consecuencias para el jugador : cualquier reinicio cambia todos los cálculos en las posibilidades de golpes.
Cómo puede abusar un jugador : muy simple: varios reinicios y el escenario de golpe más improbable pueden convertirse en realidad.
Consecuencias positivas para el desarrollador :
1) Los jugadores perciben ese juego como más honesto con aleatoriedad real, simplemente debido a la falta de conocimiento de la mecánica interna.
2) Los jugadores reciben un modo informal informal que, si lo desea, puede facilitar en gran medida áreas complejas.
3) Un desarrollador puede cubrir un obsequio usando diferentes métodos: un autoguardado por juego (es decir, sobrescribir salvaciones y muerte permanente) o prohibir guardar durante una misión (en diferentes variaciones). Y las áreas más sensibles (minijuegos de juego) se pueden calcular sobre la base de un solo grano constante, aunque técnicamente es mucho más difícil.
Un ejemplo :
La Batalla por Wesnoth [
16 ] usa grano no fijado con aleatoriedad esencialmente honesta. La honestidad radica en el hecho de que a veces son posibles secuencias de fallas completamente improbables, y el motor del juego no las corrige. El resultado de esto son las publicaciones periódicas de enojo de jugadores molestos contra desarrolladores de juegos.
Reddit es una sirena súper diestra en Wesnoth [ 17 ]Además, antes del ataque, el juego proporciona cálculos detallados de las probabilidades de cada uno de los posibles resultados del ataque: el daño infligido, el daño recibido y la probabilidad de la muerte de uno de los oponentes. La conclusión de estas probabilidades solo aumenta la ira de los "que se parecen sin éxito", porque asegurando buenas posibilidades de un ataque, es difícil llegar a un acuerdo con un resultado que obtuvo una puntuación de 1 en 1000.
3. El grano no es fijo, y los resultados mismos están sujetos a manipulaciones adicionales.Por manipulaciones, me refiero a tales ajustes dinámicos, como resultado de lo cual aumenta la sensación de aleatoriedad correcta (
justa ) debido a la pérdida de pseudoaleatoriedad real en los números resultantes.
Consecuencias para el jugador : similar a los juegos con grano no fijado, la recarga le permite contar los resultados.
Cómo un jugador puede abusar de él : con la ayuda de guardar estafas, puede elegir una combinación favorable de ataques, pero depende en gran medida del método de implementación y la disponibilidad de mecanismos de protección por parte del desarrollador.
Consecuencias positivas para el desarrollador : el desarrollador puede controlar la rareza de los resultados indeseables, hacer aparecer un "
azar honesto ", aumentar y disminuir la complejidad del juego. Si el desarrollador, al calcular la posibilidad de golpear, almacena y tiene en cuenta por separado los aspectos positivos para cada equipo, puede reducir en gran medida el abuso de estafas de salvamento, asegurando que el jugador aún recibirá su parte aritmética del daño medio.
Ejemplos :
El desarrollador Carsten Germer utiliza la función de aleatoriedad controlada para eventos raros y no solo [
18 ]. Por ejemplo, para garantizar la pérdida periódica de un bono particularmente raro con una probabilidad de 1 en 10,000, después de cada "fallo" aumenta las posibilidades en orden: 1 en 9,900; 1 a 9800; 1 a 9700 ... y así sucesivamente hasta que se grabe el evento. Y para garantizar la ausencia de rarezas frecuentes, introdujo una variable adicional que bloquea la operación en un 100% durante las siguientes 10 comprobaciones después de la última operación.
En mi panecillo Grue the Monster [
19 ], también utilicé la manipulación aleatoria. Por lo general, cuando persigue a las víctimas, el personaje del jugador debe esconderse detrás de ellas, esperando que den un paso atrás y caigan en sus patas. Por lo general, esta posibilidad es igual a 1/6 en el espacio abierto (1/2 en los pasillos y 1/1 en los callejones sin salida), pero para reducir el efecto molesto de situaciones especialmente desafortunadas, antes de cada verificación de la dirección de la víctima en el 15% de los casos, se le garantizó que iría hacia Gro .
El caso más interesante: en el juego Fire Emblem: The Binding Blade [
20 ], se implementaron las mecánicas ocultas para determinar los golpes durante los ataques [
21 ]. Tradicionalmente para la serie, el juego muestra la probabilidad de golpear como un porcentaje del 0 al 100%. En juegos anteriores de la serie, el hecho de un éxito se determinaba por un número aleatorio del 1 al 100: si el número de abandono (por ejemplo, 61) es menor o igual a la probabilidad de un impacto (por ejemplo, 75), entonces se cuenta un impacto, si es más, entonces un fallo.
Fire Emblem: The Binding Blade [ 20 ]En esta parte, se introdujo un sistema ahorrador: en lugar de un número aleatorio, se tomó el promedio de dos números aleatorios, y este promedio se comparó con el valor de precisión. Es decir, un número aleatorio tiende a un valor de 50 en mayor medida, lo que conduce a una distorsión del efecto lineal de la aleatoriedad del golpe: los luchadores con un golpe mayor al 50% golpean con más frecuencia que en el 50% de los casos, y con un golpe menor al 50% con mucha menos frecuencia. Y dado que en el juego la gran mayoría de los personajes del jugador son más precisos y la mayoría de los enemigos son menos, el jugador obtiene una ventaja oculta muy seria [
21 ]. A continuación se muestra un gráfico de este efecto, donde las líneas azules muestran la frecuencia de los golpes en el sistema anterior y la frecuencia roja de los golpes en el nuevo sistema, según el porcentaje de precisión del atacante. Por ejemplo, con la probabilidad mostrada de alcanzar el 90%, la probabilidad real será del 98.1%, con 80% - 92.2%, y con 10% - ¡solo 1.9%!
Distorsión de la posibilidad de golpear. En el eje y, la probabilidad real, en el eje x, que se muestra al jugadorEstos, por supuesto, no son los únicos ejemplos de manipulaciones con números aleatorios y equilibrio, pero es muy difícil encontrarlos. Por lo tanto, la ayuda comunitaria aquí será especialmente valiosa.
Quiero señalar que no atribuyo la generación de procedimientos a la aleatoriedad manipulada como tal. Ejemplo: un bagel generó un nivel aleatorio con un conjunto aleatorio de enemigos, trampas, muros y callejones sin salida. Si al mismo tiempo se creó un nivel que es imposible de superar, entonces un ejemplo de una curva de desarrollo, un diseño insuficientemente pensado o una prueba deficiente. El desarrollador debe verificar al menos los problemas básicos de la generación aleatoria:
- el pasaje a la salida siempre debe ser al menos en singular. Cualquier algoritmo de búsqueda de ruta ayuda aquí;
- una serie de trampas debería poder evitar, y si hay demasiadas en un solo lugar, entonces el algoritmo debe calcular su densidad y eliminar las innecesarias;
- los enemigos demasiado poderosos deben proporcionar al menos una de las formas disponibles para "pasarlos": fuerza bruta; rollos y pociones; artefactos especiales o la capacidad de huir de ellos.
Dicha intervención en resultados aleatorios no es una manipulación, sino que es simplemente la regla de un enfoque de desarrollo mínimamente competente. Estas comprobaciones se utilizan en todos los métodos de generación de números pseudoaleatorios.
4. Generalmente elimina el elemento de aleatoriedad de la mecánica del juego.Es decir, los resultados de cada ataque siempre tienen un 100% de probabilidad de golpear y reparar el daño, así como reglas constantes para activar efectos adicionales. En su lugar, puede usar cálculos aleatorios con fines cosméticos: "masticar" periódicamente los personajes que esperan su turno; volando números del daño causado; efectos de colisiones y explosiones. No hay diferencia en cómo generar números aleatorios y qué tan uniforme es la distribución.
Aunque en este caso, puede usar los primeros tres métodos en los cálculos de la inteligencia artificial, cuando los personajes enemigos pueden hasta cierto punto elegir al azar objetivos para atacar o caminar en un equipo en orden aleatorio. Pero esto será menos notable para el jugador y las situaciones molestas serán mucho menos.
Consecuencias para el jugador : el reinicio no afecta los resultados de ninguna manera, o afecta ligeramente.
Cómo un jugador puede abusar de él : un jugador puede calcular o encontrar una estrategia dominante estable en la red y usarla solo. Vale la pena señalar que para ciertos grupos de jugadores este es el principal interés en el juego.
Consecuencias positivas para el desarrollador : es mucho más fácil
para el desarrollador equilibrar tal juego. Como un inconveniente, en este caso, las estrategias dominantes emergentes se vuelven estables, lo que significa que incluso la mala suerte de un jugador no podrá vencerlo, pero conducirá a la desaparición de cualquier sorpresa, aburrimiento y eliminación del juego. Los jugadores de clase alta casi siempre ganarán jugadores de clase baja, para varios tipos de juegos esto puede ser tanto una ventaja como una desventaja.
Un ejemplo :
Cualquier ajedrez con reglas clásicas.
El roguelike lógico también es adecuado aquí. Por ejemplo, este método está muy bien implementado en Desktop Dungeons Alpha [
22 ].
Alfa de las mazmorras de escritorio [ 22 ]Aquí los resultados de la secuencia de ataque son siempre los mismos y se calculan de antemano. Sin embargo, debido a la generación aleatoria (de procedimiento) de las mazmorras del juego y la presencia de una niebla de guerra, el juego adquiere su capacidad de reproducción única de los mejores bagels.
Conclusión
Por lo tanto, el artículo considera dos subtemas de aleatoriedad en los juegos:
- Supuestos erróneos en la estimación de probabilidades . Describe las suposiciones intuitivas que hace el jugador, y que a menudo resultan estar equivocadas debido a su subjetividad. La conclusión principal: la aleatoriedad verdadera no solo no garantiza que los usuarios estén satisfechos, sino que incluso puede conducir al efecto contrario.
- Generación de números pseudoaleatorios . Se describen diferentes enfoques para usar la aleatoriedad. Los ejemplos de implementación exitosos muestran que, independientemente del enfoque elegido, el juego puede resultar interesante, inesperado y con un buen grado de rejugabilidad.
El uso consciente y consistente del enfoque elegido permite a los desarrolladores enfatizar sus aspectos positivos y minimizar los negativos.