Salutations !
Quelqu’un d’autre que moi a-t-il eu affaire à une bizarrerie comme celle-ci avec Ink ?
Soit une fonction toute simple pour lancer un dé à six faces :
== function get_one_die_roll ==
{shuffle:
- ~ return 1
- ~ return 2
- ~ return 3
- ~ return 4
- ~ return 5
- ~ return 6
}
Que j’appelle tout aussi simplement dans mon code principal pour afficher le résultat d’un lancer de deux dés, à répéter à l’infini :
[code]== roll_dice ==
{get_one_die_roll()} {get_one_die_roll()}
- [Relancer les dés]
→ roll_dice[/code]
Et voilà mon souci : quand j’exécute ce code, quel que soit le nombre d’itérations, je n’obtiens jamais de tirage double (1 1, 2 2, 3 3, etc.). Comme si le bloc « shuffle » ne devait jamais tirer le même résultat deux fois de suite entre deux choix de joueur !
Y a-t-il quelque chose dans le concept du « random » façon Ink que j’aurais manqué ?
D’avance, merci !
Effectivement, je n’ai moi non plus pas réussi à obtenir de doublet avec cette fonction… C’est étrange. Pour être sûr que ce n’était pas juste de la malchance, j’ai aussi essayé avec une fonction qui ne sort que 1 et 2, mais même dans ce cas-ci on a un comportement bizarre : si on lance plus de dés que leur nombre de face (par exemple 3 dés à 2 faces), alors on peut obtenir des doublet (1 1 2 ou 2 1 1), mais jamais des triplets.
Mon intuition me dit que c’est parce que les séquences dans ink sont — je crois — inspirées par Inform, et que par défaut avec Inform ça ne répète pas deux fois le même résultat (pour éviter les répétitions ennuyeuses), même si on peut faire du pure aléatoire. Mais ça n’explique pas le comportement bizarre quand on lance plus de dés. Et aussi, comme tu l’as fais remarquer, les répétitions ne sont interdites que dans le même nœud (on peut obtenir 1 2 puis 2 1, on a donc le 2 qui s’est répété si on compte de manière globale).
Et comme l’exemple de la documentation montre un lancer de pièce à pile ou face, elle sous-entend que ça devrait être totalement aléatoire.
Mais heureusement, il existe déjà un fonction dans ink pour tirer un nombre aléatoire, pas besoin de la recréer ! (C’est dificile à savoir, parce qu’elle n’est pas mentionnée dans la documentation.)
[code]== function get_one_die_roll ==
~ return RANDOM(1, 6)
[/code]
Et là, tout semble fonctionner comme il faut. Mais du coup, la fonction créée n’a plus forcément d’intérêt puisqu’on peut juste directement utiliser RANDOM…
Ça résout ton problème, mais je suis quand même intrigué par le comportement de shuffle. Je vais faire plus de tests et écrire un rapport de bug sur le dépôt d’ink.
Oh, merci ! En effet, cette fonction RANDOM semble beaucoup plus simple et plus fiable. Néanmoins, je pense continuer à l’utiliser via une fonction à moi, pour « l’interface ».
Oui, bien sûr ! Tu peux aussi ajouter un argument, si jamais tu veux pouvoir faire varier le nombre de faces.
[code]== function get_one_die_roll(n) ==
~ return RANDOM(1, n)[/code]
Après, si tu n’as besoin que de dés à six faces, ce n’est pas la peine, évidemment.