Le hasard dans les jeux vidéo

Échecs et maths

Dans les jeux vidéo, le hasard est partout. Il détermine la forme des rivières dans Banished, la réussite d'un tir de sniper dans XCOM2, l'effet d'un tacle dans Bloodbowl, les caractéristiques de vos personnages dans Oxygen Not Included, le butin que vous trouverez dans PUBG. Prenons donc le temps d'étudier comment on crée du hasard dans un programme informatique. Vous allez voir, c'est bien moins simple qu'on pourrait le croire.

Par ackboo | le 26 mars 2018

Les ordinateurs sont des engins merveilleux, mais ils ont un problème avec le hasard. Ils sont incapables d'en produire. Le vrai hasard, purement logiciel, n'existe pas. La raison est toute naturelle : les ordinateurs (littéralement, des machines qui « ordonnent », c'est-à-dire qui rangent dans un ordre donné) sont précisément conçus pour ne rien faire au hasard. Ils sont impitoyablement déterministes. Quand vous demandez à un PC d'exécuter une opération, le résultat qu'il fournira sera toujours le même si les données de départ sont identiques. Quand les premiers ordinateurs modernes sont apparus, au milieu du XXe siècle, les pionniers de la programmation se sont évidemment penchés sur ce problème d'une importance capitale. Notamment parce que la cryptographie a besoin, pour fonctionner, de nombres imprévisibles dont aucun cerveau humain ne pourra déceler le mécanisme de création – bref, de nombres générés au hasard.

Si vous donnez la même seed à un algorithme, il vous produira la même série de nombres aléatoires. Du vrai hasard élevé en plein air. Ils ont d'abord pensé à utiliser le hasard de la nature (ce qu'on appelle l'entropie) pour arriver à leurs fins. En 1951, le Ferranti Mark 1, dont Alan Turing fut l'un des concepteurs, était capable de générer une série aléatoire de vingt 0 ou 1 en exploitant les variations de son propre bruit électrique. Ce hasard-là est « authentique », on parle alors de TRNG pour true random number generator. Encore aujourd'hui, on utilise l'entropie du monde physique pour produire un hasard pur et total. Par exemple, la société Hotbits fournit des nombres aléatoires en mesurant la désintégration radioactive du césium 137. Le site Random.org capte lui le bruit de fond de l'atmosphère terrestre. Et Intel produit des chipsets spécialisés pour serveurs qui utilisent les variations de leur température pour nourrir un générateur de nombres aléatoires.

Littérature des années 1950. Mais tout ça n'est pas bien pratique. Ce sont des solutions hardware, basées sur des capteurs externes, du matériel. Il fallait trouver autre chose, une façon de générer du hasard de manière purement software. Quelques années après la Seconde Guerre mondiale, les chercheurs commencèrent donc à perfectionner des algorithmes générant du pseudo-hasard, appelés en anglais pseudorandom number generators (PRNG), pour générateurs de nombres pseudo-aléatoires. Notez bien le « pseudo », qui signifie que... c'est de la triche. Du toc. Ça n'est pas du vrai hasard. C'est une filouterie informatique. La technique : prendre une valeur de base (la seed en anglais, la graine) et la triturer dans tous les sens avec des opérations mathématiques complexes pour en tirer une série de nombres qui sembleront aléatoires. Les premiers générateurs de ce type étaient une telle nouveauté à l'époque qu'en 1955, les chercheurs de la RAND Corporation, think tank semi-officiel de l'Armée US, publièrent fièrement en librairie un livre intitulé A Million Random Digits with 100,000 Normal Deviates. Il contenait 400 pages de nombres générés grâce au nouvel algorithme de pseudo-hasard qu'ils avaient créé. Il est encore aujourd'hui considéré comme un ouvrage à la portée scientifique considérable.

Lorsque vous rechargez la mission après l'échec d'un tir, vous retrouvez exactement le même pseudo-hasard. Makoto, Takuji, Seppuku. Ces algorithmes n'ont cessé d'être améliorés durant toute la seconde moitié du XXe siècle. Certains étaient très performants, mais généraient des séries de nombres qui se répétaient rapidement. D'autres produisaient des « cycles » plus longs, mais brutalisaient le processeur. C'est alors qu'arrivèrent deux mathématiciens japonais, Makoto Matsumoto et Takuji Nishimura. Regardez bien la photo de Makoto Matsumoto sur cette page, et dites-vous une chose : cet homme et son collègue vous ont forcément, un jour, fait rager devant l'ordinateur. En 1997, ils mettent au point le Mersenne Twister. Ce fut le premier algorithme à offrir performance et cycle long. Donnez-lui une valeur de base et il vous crachera à la vitesse de l'éclair une série de 219937−1 nombres pseudo-aléatoires. Il est encore très utilisé aujourd'hui, puisque c'est le générateur par défaut du langage C++, et donc d'une grande majorité des jeux AAA de ces vingt dernières années. Le moteur 3D Unity, quant à lui, exploite un algorithme un peu différent, au nom poétique de Xorshift 128, développé par le chercheur américain George Marsaglia en 2003.

Planter la petite graine. Revenons maintenant à des considérations plus pratiques. J'ai parlé précédemment de la seed, c'est-à-dire le nombre de départ de la génération aléatoire. La seed permet de générer un pseudo-hasard reproductible. Si vous donnez la même seed à un algorithme, il vous produira la même série de nombres aléatoires. Cette astuce est très utilisée dans le jeu vidéo. Prenons l'exemple de trois titres très populaires : Anno, Minecraft et Banished. En début de partie, vous avez peut-être remarqué qu'ils vous permettent de rentrer vous-même une seed. Cela veut dire que le jeu va utiliser cette graine de départ pour générer les millions de nombres aléatoires qui servent à créer procéduralement le terrain. Du coup, si vous trouvez un terrain intéressant, il vous suffit juste de fournir la seed aux autres joueurs (une simple série de chiffres, comme « 8787 » ou « 0123456 ») pour qu'ils puissent eux aussi le générer à leur prochaine partie. C'est normal, car le pseudo-hasard informatique est purement déterministe. Souvenez-vous ce qu'on disait plus haut : quand on fournit les mêmes données à une machine (ici la seed), cette bestiole têtue produit toujours le même résultat.

Non, mais purée c'est de la triche là ! Cette histoire de seed change radicalement la façon dont un joueur fait face à l'échec lorsque le hasard lui est défavorable. Prenons le cas d'une série tactique bien connue pour faire hurler de rage les masochistes : XCOM. C'est votre tour de jouer, vous sélectionnez votre sniper et vous lui dites de tirer sur un gros extraterrestre huileux. Le jeu indique que vous avez 92 % de chance de réussir l'action. Le sniper tire. En coulisses, le jeu génère un nombre aléatoire (probablement grâce au Mersenne Twister puisque les XCOM sont codés en C++) compris entre 0 et 100. S'il est inférieur ou égal à 92, le tir réussira. Mais là, bien sûr, votre sniper manque lamentablement sa cible. Si, comme moi, vous n'avez ni honneur ni morale, vous reprenez alors la sauvegarde que vous venez d'effectuer il y a cinq secondes et vous retentez l'action. Même tir, même chance de réussite à 92 % et... il manque encore. Trois fois, dix fois, vingt fois, vous avez beau recharger la partie, le tir passe à côté. « Crevures de développeurs ! C'est de la triche ! Ça n'est pas possible autrement ! », hurlez-vous en désinstallant le jeu. Et vous avez tort. XCOM ne triche pas. Au contraire, il vous empêche de tricher. Pour comprendre ce qui se passe, il faut décortiquer la façon dont il produit du hasard.