Idées fausses des joueurs lors de l'évaluation des risques. Contrôle du générateur de nombres aléatoires en développement

Le cerveau humain, de par sa nature même, est très faible pour évaluer la probabilité de survenance d'événements aléatoires, sur la base d'une évaluation numérique donnée. Et assez bien sur la base des notes de qualité. Et tout cela parce qu'une personne effectue mentalement la conversion des probabilités numériques en estimations qualitatives, et le fait de manière très subjective:

  • 80% d'un tir dans le jeu - eh bien, c'est un coup presque garanti;
  • 80% du fait que votre camarade rembourse au moins un jour une dette est non-non-non, cela ne fonctionnera pas, c'est trop de risque;
  • 5% ont reçu des dégâts critiques, il est le PNJ de l'ennemi - il est peu probable que le risque puisse être ignoré;
  • 1% de risque de chute de glaçons si vous marchez sous le toit avec des glaçons dégoulinant d'un mètre de haut - quoi d'autre, il vaut mieux se déplacer de l'autre côté du trottoir
  • 51% de chances de gagner un mini-jeu dans un grand RPG - vous pouvez vous attendre à ce que, après 20 paris, je gagne un peu ou du moins reste avec le mien ... après 20 paris ... comment est-ce possible que j'ai perdu la moitié de mon de l'or? Ici, le générateur de nombres aléatoires est clairement cassé!


Les questions suivantes seront examinées dans l'article:

  • hypothèses erronées dans l'estimation des probabilités;
  • des exemples spécifiques d'idées fausses des joueurs et des probabilités réelles d'événements «rares»;
  • générateur de nombres aléatoires (généralement pseudo-aléatoire);
  • premiers générateurs de nombres pseudo-aléatoires simples utilisant Final Fantasy I comme exemple;
  • approches pour la mise en œuvre d'événements aléatoires avec reproductibilité et sans;
  • des exemples d'approches et de manipulations implémentées avec succès dans Fire Emblem.

I. Hypothèses erronées dans l'estimation des probabilités


En cours d'évolution, le cerveau humain a appris à très bien fonctionner avec des évaluations qualitatives des événements et des images de son expérience. Une personne a proposé des chiffres et une estimation numérique abstraite de la probabilité d'événements «aléatoires» relativement récemment [ 1 ]. Néanmoins, les gens dans leurs estimations convertiront toujours ces chiffres en représentations qualitatives: un peu, un peu, beaucoup, dangereux, sûr, assez. Ces évaluations dépendent toujours du contexte et de l'attitude subjective à l'égard de ce contexte. C'est précisément la principale cause d'hypothèses numériques erronées.

À titre d'exemple, le jeu au tour par tour Disciples 2 [ 2 ] sera considéré. Cette partie de l'article ne considérera pas la qualité de la génération de nombres aléatoires spécifiquement dans ce jeu. Il y aura suffisamment de données sur leur génération dans la deuxième partie de l'article.

Disciples 2 - Miss typique [ 2 ]

Une attaque de mêlée standard a 80% de chances de toucher. Habituellement, cette chance est perçue par le joueur comme « presque toujours », et le risque de manquer est « occasionnellement / occasionnellement ». La chance de manquer 2 fois de suite avec deux attaques est de 4%. Le joueur perçoit ce risque comme « presque jamais / cela se produira extrêmement rarement ». Et lorsque cela se produit, les joueurs sont indignés à la "courbe aléatoire": [ 3 ]; [ 4 ].

Mais dans les situations avec deux échecs consécutifs et une évaluation des risques de 4%, une évaluation rapide par le joueur a plusieurs hypothèses erronées:

1. 4% n'est pas « presque jamais » . C'est un événement qui se produira dans chaque 25ème expérience indépendante (en moyenne).

2. L'évaluation est effectuée sur le mauvais intervalle de temps . L'intervalle de mesure d'attaque minimum de 80% doit être pris non pas 2 attaques, mais toutes les attaques de la même classe (~ 80%) pendant la mémoire du joueur "méfiant". Le plus souvent, pendant cette période, vous pouvez prendre une longue session de jeu ou tout le jeu en général, tout dépend du type de jeu, de la mémoire du joueur et des préférences du joueur.

Comme je n'ai pas de statistiques réelles sur l'utilisation de ce jeu, je partirai de l'hypothèse qu'une longue session de jeu dans Disciples 2 dure 3 heures et pendant ce temps environ 250 attaques avec une précision de ~ 80% sont effectuées. Il convient de noter que les missiles ennemis doivent être ignorés, car leurs ratés le joueur n'est pas en colère, et il s'en souvient rarement.

Donc, la situation doit être évaluée: "Pour les 250 attaques, 2 échecs consécutifs ne se produiront jamais."
Pour calculer la probabilité de vérité de cet événement, la formule de récurrence a été utilisée: P1 (n) = 0,8 * P1 (n-1) + 0,16 * P1 (n-2). En dérivant cette formule, j'ai pris l'aide de la communauté, une citation des calculs, des détails et le résultat sont donnés ci-dessous.
Vous pouvez essayer d'utiliser l'induction. Nous introduisons une notation. La probabilité de conserver la patte après la nième sortie est indiquée par P (n). Nous représentons cette probabilité comme la somme de deux probabilités
P (n) = P1 (n) + P2 (n), où P1 (n) est la probabilité à laquelle l'extrême n-ème sortie s'est avérée réussie, et P2 (n) - a échoué.

Il peut sembler que P1 et P2 soient proportionnelles à 0,8 et 0,2, mais ce n'est pas le cas. En raison du fait que nous n'envisageons aucun résultat possible, mais uniquement ceux qui ont sauvé la patte de raton laveur.
Essayons maintenant de dériver une formule de récurrence
P1 (n) = 0,8 * (P1 (n-1) + P2 (n-1))
P2 (n) = 0,2 * P1 (n-1)
Remplacer P2 dans la formule pour P1 nous obtenons
P1 (n) = 0,8 * P1 (n-1) + 0,16 * P1 (n-2)
Solution supplémentaire des relations de récurrence [5]
Citation de l'utilisateur Serbbit [ 6 ]

Pour résoudre le problème, au lieu de comprendre les méthodes de résolution des relations de récurrence, nous avons écrit un petit code javascript pour la console du navigateur et calculé le résultat.

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]); } // : 250) 0.0001666846271670716 

La réponse est: 0.0001666846271670716
Ou 0,0167%

Cette réponse coïncide avec la réponse d'un autre auteur Kojiec9: 0,000166684627177505 [ 6 ], qui a utilisé sa méthode développée avec un système de nombres à cinq décimales et calculé le résultat en utilisant sa formule en Pascal. Des différences mineures dans les réponses s'expliquent, apparemment, par l'arrondissement des nombres flottants.

Ainsi, en 3 heures de jeu sur Disciples 2, un joueur a une chance d'éviter un double échec avec une précision de 80% à seulement 0,0167% . Maintenant, c'est vraiment très peu probable. (et la probabilité d' au moins un double échec est de 99,9833% , respectivement).

Une augmentation de la probabilité d'au moins un double échec avec une augmentation du nombre d'expériences

À propos de l'imperfection et des distorsions de la mémoire humaine, en passant, en général, des études et des livres entiers existent: «Illusions du cerveau. Distorsions cognitives dues à une surabondance d'informations »[ 7 ]; «Ne croyez pas votre cerveau» [ 8 ], si vous êtes intéressé par ce sujet, je vous recommande de commencer à vous familiariser avec ces articles.

3. La troisième hypothèse incorrecte est l' attente de dépendance dans des expériences mutuellement indépendantes .

Autrement dit, après le premier échec, le joueur pense:

«Donc, le personnage a raté avec une précision de 80%. Maintenant, il va certainement frapper, car le risque de double échec n'est que de 4%. "

Mais non. Après le premier échec, le risque d'un autre échec sera également de 20%. Après tout, l'attaque passée s'est déjà produite et n'affecte pas le futur tir. De plus, si avant la première attaque la probabilité d'un double échec était de 4%, alors après la première attaque la probabilité d'un double échec devient déjà 20%, c'est-à-dire par rapport aux attentes du joueur, le risque ne fait qu'augmenter.

Cette caractéristique du cerveau humain est particulièrement attrayante pour les manipulations par le casino (et similaires) dans le jeu (plus sur le dispositif des machines à sous du fabricant [ 9 ]).
Des exemples plus intéressants des perturbations mentales du cerveau humain peuvent être trouvés dans des articles sur l'équilibre de Jan Schreiber, «Niveau 5: Probabilité et aléa devenus horriblement mauvais» ( Niveau 5. La probabilité et le hasard étaient colportés ) [ 10 ].

II. Générateur de nombres aléatoires


Le terme «générateur de nombres aléatoires» (RNG / générateur de nombres aléatoires) utilisé dans les jeux signifie presque toujours en fait «générateur de nombres pseudo aléatoires» [ 11 ]. La principale caractéristique de ce générateur est sa reproductibilité. La reproductibilité signifie que, connaissant l'élément générateur initial (ou germe), la même séquence de nombres aléatoires ( pseudo-aléatoires ) sera toujours obtenue. Dans certains jeux, cet effet se manifeste par le fait qu'après avoir redémarré le jeu, la séquence des coups sûrs et manqués reste inchangée. Mais dans d'autres jeux ne reste pas le même.

Et la chose est de savoir comment ce générateur de nombres pseudo-aléatoires est utilisé et quels objectifs de conception le développeur poursuit.

Pour mieux comprendre le principe de fonctionnement du générateur de nombres pseudo-aléatoires, on peut considérer la manière dont il est implémenté dans les premiers jeux classiques, lorsque les ressources des ordinateurs (et consoles) étaient particulièrement sévèrement limitées. (Pour une description détaillée des exemples et de leurs fonctionnalités, voir l'article «Comment les jeux classiques utilisent intelligemment la génération de nombres aléatoires» [ 12 ]. )

Comment les jeux classiques utilisent intelligemment la génération de nombres aléatoires [ 12 ]

Final Fantasy, j'ai utilisé plusieurs tableaux avec des nombres fixes prédéfinis avec 256 valeurs dans chaque tableau:

  • pour calculer des batailles aléatoires à chaque étape de la carte du jeu, l'algorithme s'est déplacé autour de la table, changeant l'index de 1 à la fois, faisant ainsi défiler progressivement toutes les valeurs possibles - à la fois le fait de la collision et un éventuel groupe d'adversaires en dépendait;
  • Pour calculer les résultats de la bataille, un tableau similaire de 256 valeurs fixes a également été utilisé, mais son déplacement s'est produit non seulement à chaque utilisation ultérieure du nombre pseudo-aléatoire, mais également toutes les 2 images. Autrement dit, toutes les 2 images, l'algorithme faisait défiler inutilement le tableau avec des nombres, réduisant ainsi le risque de séquences identiques prédites. La source d'entropie ici était l'incertitude de la durée de réflexion du joueur avant de choisir la prochaine équipe.

Final Fantasy I utilise le numéro de série (index) d'une valeur fixe dans le tableau comme grain (génératrice). C'est-à-dire que, sachant où les nombres aléatoires seront sélectionnés, on peut prédire avec précision quel nombre aléatoire sera émis après 1000 vérifications. Dans les algorithmes de génération de nombres pseudo-aléatoires plus complexes, le grain n'est pas si facile à utiliser, mais le principe et l'effet de base restent.

Maintenant, pour la génération de nombres pseudo-aléatoires, les bibliothèques standard des langages de programmation utilisés sont principalement utilisées. L'heure actuelle du système est le plus souvent utilisée comme source d'entropie. Pour les besoins de l'industrie du jeu, les caractéristiques des bibliothèques standard sont généralement suffisantes. Les inconvénients du générateur et de la source d'entropie sont rarement utilisés par les joueurs en raison de la complexité de leur calcul et de leur manipulation. Habituellement, cela reste le lot des programmeurs speedraner ( par exemple, piratant la logique de Pokemon Colosseum [ 13 ] ), ce qui signifie que les développeurs sont plus sages d'ignorer de telles subtilités.

III. Différentes approches d'utilisation du générateur


1. Le grain est fixé au moment du début de la mission ou de la campagne de jeu.

Conséquences pour le joueur : le rechargement du jeu ne changera pas le fait d'un coup manqué par le personnage (appelons-le fou Fidel ), même si la probabilité de son coup est de 99%. Cependant, avant d'essayer de toucher, le joueur peut effectuer une autre action qui utilise un nombre aléatoire, par exemple, il ressemble à un autre personnage - le chauve Mick . À la suite de cela, le nombre aléatoire malchanceux sera utilisé par le chauve Mick, et le prochain nombre aléatoire de la séquence sera utilisé sur le fou Fidel - alors il l'obtiendra probablement.

Comment un joueur peut-il en abuser : si un tir avec une précision de 50% entraîne un échec, vous pouvez redémarrer et essayer l'attaque avec une précision légèrement supérieure (55%) jusqu'à ce qu'elle frappe. Après le coup, enregistrez et répétez cela avec d'autres lancers.

Conséquences positives pour le développeur :

1) Le jeu peut être reproduit étape par étape, si seuls l'état initial, le grain et la séquence d'actions sont stockés. Grâce à cela, il est possible d'afficher des répétitions et même de stocker de manière très compacte les fichiers de sauvegarde. La méthode vous permet d'économiser beaucoup d'espace sur le disque / mémoire.

2) Protection du jeu interne afin que la sauvegarde / chargement ne permette pas au joueur de mettre en faillite tous les adversaires PNJ rencontrés.

Un exemple :

Le jeu rogue-like Brogue [ 14 ] utilise cette méthode, en commençant par la génération du monde du jeu et en terminant par une erreur de calcul de toutes les actions du joueur. En conséquence, seuls le grain de départ et la séquence de commandes de jeu sont stockés dans le fichier de sauvegarde. Un bonus supplémentaire de cet effet est que le jeu peut être démarré avec le nombre de grains sélectionné, après avoir sélectionné le monde le plus intéressant dans les tableaux des mondes Brogue générés [ 15 ].

Brogue roguelike - Site officiel [ 14 ]

2. Le grain n'est pas fixé ou mis à jour à chaque fois après un redémarrage.
Conséquences pour le joueur : tout redémarrage modifie tous les calculs des chances de succès.

Comment un joueur peut en abuser : très simple - plusieurs redémarrages et le scénario de coup le plus improbable peuvent devenir une réalité.

Conséquences positives pour le développeur :

1) Les joueurs perçoivent un tel jeu comme plus honnête avec un vrai hasard, simplement en raison d'un manque de connaissance des mécanismes internes.

2) Les joueurs reçoivent un mode informel facile, qui, si désiré, peut grandement faciliter les zones complexes.

3) Le développeur peut couvrir un cadeau de différentes manières: une sauvegarde automatique pour le jeu (c'est-à-dire des sauvegardes par écrasement et une mort permanente) ou interdisant de sauvegarder pendant la mission (dans différentes variantes). Et les zones les plus sensibles (jeux de mini-jeux) peuvent être calculées sur la base d'un seul grain constant, bien que techniquement cela soit beaucoup plus difficile.

Un exemple :

The Battle for Wesnoth [ 16 ] utilise du grain non fixé avec un caractère aléatoire essentiellement honnête. L'honnêteté réside dans le fait que des séquences d'échecs parfois totalement improbables sont possibles, et le moteur de jeu ne les corrige pas. Le résultat de ceci est les messages en colère périodiques des joueurs agacés contre les développeurs de jeux.

Reddit est une sirène super habile à Wesnoth [ 17 ]

De plus, avant l'attaque, le jeu fournit des calculs détaillés des probabilités de chacun des résultats possibles de l'attaque: les dégâts infligés, les dégâts reçus et la probabilité de décès de l'un des adversaires. La conclusion de ces probabilités ne fait qu'augmenter la colère de celles qui «ne ressemblent pas», car assurant de bonnes chances d'une attaque, il est difficile de se réconcilier avec un résultat qui avait un score de 1 sur 1000.

3. Le grain n'est pas fixe et les résultats eux-mêmes sont soumis à des manipulations supplémentaires.

Par manipulations, j'entends de tels ajustements dynamiques, à la suite desquels le sentiment d'aléatoire correct ( passable ) augmente en raison de la perte de pseudo-aléatoire réel dans les nombres résultants.

Conséquences pour le joueur : similaire aux jeux à grain non fixé - le rechargement vous permet de recompter les résultats.

Comment un joueur peut en abuser : à l'aide d'une arnaque de sauvegarde, vous pouvez choisir une combinaison d'attaques favorable, mais cela dépend en grande partie de la méthode de mise en œuvre et de la disponibilité de mécanismes de protection de la part du développeur.

Conséquences positives pour le développeur : le développeur peut contrôler la rareté des résultats indésirables, faire apparaître un " honnête hasard ", augmenter et diminuer la complexité du jeu. Si le développeur, lors du calcul des chances de frapper, stocke et prend séparément en compte le déclenchement pour chaque équipe, il peut réduire considérablement les abus de sauvegarde frauduleuse, en s'assurant que le joueur recevra toujours sa portion arithmétique moyenne des dégâts.

Exemples :

Le développeur Carsten Germer utilise la fonction d'aléatoire contrôlé pour des événements rares et pas seulement [ 18 ]. Par exemple, pour garantir la perte périodique d'un bonus particulièrement rare avec une chance de 1 sur 10 000, après chaque «échec», il augmente les chances dans l'ordre: 1 sur 9 900; 1 à 9800; 1 à 9700 ... et ainsi de suite jusqu'à ce que l'événement soit enregistré. Et afin de garantir l'absence de raretés fréquentes, il a introduit une variable supplémentaire qui bloque l'opération de 100% lors des 10 prochains contrôles après la dernière opération.

Dans mon bagage Grue the Monster [ 19 ], j'ai également utilisé une manipulation aléatoire. En règle générale, lors de la poursuite des victimes, le personnage du joueur doit se cacher derrière eux, en attendant qu'elles reculent et tombent entre ses pattes. Habituellement, cette chance est égale à 1/6 dans l'espace ouvert (1/2 dans les couloirs et 1/1 dans les impasses), mais afin de réduire l'effet gênant des situations particulièrement malchanceuses, avant chaque contrôle du déroulement des mouvements de la victime dans 15% des cas, elle était garantie d'aller vers Gro .

Le cas le plus intéressant: dans le jeu Fire Emblem: The Binding Blade [ 20 ], les mécanismes cachés de détermination des coups lors des attaques [ 21 ] ont été implémentés. Traditionnellement pour la série, la probabilité de toucher est indiquée par le jeu en pourcentage de 0 à 100%. Dans les jeux précédents de la série, le fait d'un coup était déterminé par un nombre aléatoire de 1 à 100: si le nombre d'abandon (par exemple, 61) est inférieur ou égal à la probabilité d'un coup (par exemple, 75), alors un coup est compté, si plus, alors un échec.

Fire Emblem: The Binding Blade [ 20 ]

Dans cette partie, un système d'épargne a été introduit: au lieu d'un nombre aléatoire, la moyenne de deux nombres aléatoires a été prise, et cette moyenne a été comparée à la valeur de précision. C'est-à-dire qu'un nombre aléatoire tend vers une valeur de 50 dans une plus grande mesure. Cela conduit à une distorsion de l'effet linéaire du caractère aléatoire du coup: les combattants avec un coup supérieur à 50% frappent plus souvent que dans 50% des cas, et avec un coup moins de 50% beaucoup moins souvent. Et comme dans le jeu, la grande majorité des personnages du joueur sont plus précis et que la plupart des ennemis le sont moins, le joueur obtient un avantage caché très sérieux [ 21 ]. Ci-dessous est un graphique de cet effet, où les lignes bleues montrent la fréquence des coups dans l'ancien système, et la fréquence rouge des coups dans le nouveau système en fonction du pourcentage de précision de l'attaquant. Par exemple, avec la probabilité affichée d'atteindre 90%, la probabilité réelle sera de 98,1%, avec 80% - 92,2% et avec 10% - seulement 1,9%!

Distorsion des chances de frapper. Sur l'axe des y, la probabilité réelle, sur l'axe des x - montrée au joueur

Ce ne sont bien sûr pas les seuls exemples de manipulations avec des nombres aléatoires et un équilibre, mais il est très difficile de les trouver. Par conséquent, l'aide communautaire sera particulièrement précieuse.

Je tiens à noter que je n'attribue pas la génération procédurale à l'aléatoire manipulé en tant que tel. Exemple: un bagel a généré un niveau aléatoire avec un ensemble aléatoire d'ennemis, de pièges, de murs et d'impasses. Si en même temps un niveau impossible à franchir était créé, alors un exemple de courbe de développement, de conception insuffisamment pensée ou de tests faibles. Le développeur doit vérifier au moins les problèmes de base de la génération aléatoire:

  • le passage à la sortie doit toujours être au moins au singulier. Tous les algorithmes de recherche de chemin aident ici;
  • une série de pièges devrait pouvoir être contournée, et s'il y en a trop en un seul endroit, alors l'algorithme doit calculer leur densité et en supprimer les inutiles;
  • les ennemis trop puissants doivent fournir au moins un des moyens disponibles pour les «dépasser»: la force brute; parchemins et potions; des artefacts spéciaux ou la possibilité de s'enfuir.

Une telle intervention dans des résultats aléatoires n'est pas une manipulation, mais est simplement la règle d'une approche de développement minimalement compétente. Ces vérifications sont utilisées dans toutes les méthodes de génération de nombres pseudo-aléatoires.

4. Supprimez généralement l'élément aléatoire de la mécanique du jeu.

Autrement dit, les résultats de chaque attaque ont toujours 100% de chances de toucher et de réparer les dégâts, ainsi que des règles constantes pour déclencher des effets supplémentaires. Au lieu de cela, vous pouvez utiliser des calculs aléatoires à des fins esthétiques: «mastication» périodique des personnages attendant leur tour; envoler les nombres des dommages causés; effets des collisions et des explosions. Il n'y a aucune différence sur la façon de générer des nombres aléatoires et sur la répartition uniforme de la distribution.

Bien que dans ce cas, vous pouvez utiliser les trois premières méthodes dans les calculs de l'intelligence artificielle, lorsque les personnages ennemis peuvent dans une certaine mesure choisir au hasard des cibles à attaquer ou marcher en équipe dans un ordre aléatoire. Mais cela sera moins visible pour le joueur et les situations gênantes le seront beaucoup moins.

Conséquences pour le joueur : le redémarrage n'affecte en aucun cas les résultats, ou il affecte légèrement.

Comment un joueur peut en abuser : un joueur peut calculer ou trouver une stratégie dominante stable sur le réseau et l'utiliser uniquement. Il convient de noter que pour certains groupes de joueurs, c'est le principal intérêt du jeu.

Conséquences positives pour le développeur : il est beaucoup plus facile pour le développeur d'équilibrer un tel jeu. En tant que moins - dans ce cas, les stratégies dominantes émergentes deviennent stables, ce qui signifie que même la malchance d'un joueur ne pourra pas le vaincre, mais entraînera la disparition de toute surprise, l'ennui et la suppression du jeu. Les joueurs de haut niveau gagneront presque toujours des joueurs de classe inférieure, pour différents types de jeux, cela peut être à la fois un avantage et un inconvénient.

Un exemple :

Tous les échecs avec des règles classiques.

Les roguelike logiques conviennent également ici. Par exemple, cette méthode est très bien implémentée dans Desktop Dungeons Alpha [ 22 ].

Donjons de bureau Alpha [ 22 ]

Ici, les résultats de la séquence d'attaque sont toujours les mêmes et calculés à l'avance. Cependant, en raison de la génération aléatoire (procédurale) de donjons de jeu et de la présence d'un brouillard de guerre, le jeu acquiert sa rejouabilité unique des meilleurs bagels.

Conclusion


Ainsi, l'article considère deux sous-thèmes de l'aléatoire dans les jeux:

  • Hypothèses erronées dans l'estimation des probabilités . Il décrit les hypothèses intuitives que le joueur fait, et qui s'avèrent souvent fausses en raison de leur subjectivité. La principale conclusion: le vrai hasard non seulement ne garantit pas que les utilisateurs seront satisfaits, mais peut même conduire à l'effet inverse.
  • Génération de nombres pseudo aléatoires . Différentes approches de l'utilisation de l'aléatoire sont décrites. Des exemples d'implémentation réussis montrent que quelle que soit l'approche choisie, le jeu peut s'avérer intéressant, inattendu et avec un bon degré de rejouabilité.

    L'utilisation cohérente et consciente de l'approche choisie permet aux développeurs de mettre l'accent sur leurs aspects positifs et de minimiser les aspects négatifs.


Source: https://habr.com/ru/post/fr432080/


All Articles