Aller au contenu

Tirages

tilttek/generator

Generator::draw() prend le nom d'un générateur et un Draw, et retourne un DrawResult :

use Tilttek\Generator\Draw;

$result = $generator->draw('name.elf', new Draw(count: 5, unique: true, seed: 'table 7'));

$result->results;     // list of texts, structured results or maps
$result->first();     // the first result, or null
$result->isShort();   // fewer results than asked
$result->toArray();   // ['generator' => …, 'results' => […], 'requested' => 5, 'short' => false]

Un état d'un tirage au suivant

Un générateur muni d'un état (une table à mémoire) prend l'état que son dernier tirage a laissé, et retourne le nouveau :

$result = $generator->draw('weather', new Draw(count: 7, state: $saved));

$result->state;       // ['cell' => '13'], to keep for the next draw
$result->toArray();   // […, 'state' => ['cell' => '13']]

L'état d'un tirage est une table d'au plus Draw::STATE_VALUES (32) noms vers des textes d'au plus Draw::STATE_LENGTH (1024) caractères, en UTF-8 comme le germe ; les nombres, les booléens et les objets qui s'affichent se lisent comme des textes, tout le reste est une InvalidDefinition. La bibliothèque ne garde aucun état : l'application le tient entre les tirages, par campagne, par table ou par personne, et le repasse. Un générateur sans état ignore celui qu'apporte un tirage, et son résultat n'a pas d'état. Voyez Tables à mémoire.

Résultats uniques

Un tirage unique (comme generate('name', 3) dans un gabarit et un champ {generate: name, count: 3}) produit des résultats l'un après l'autre jusqu'à en avoir assez de différents, en les comparant en entier, ou jusqu'à avoir épuisé ses tentatives : Limits::$attempts fois le nombre demandé. Il ne boucle jamais sans fin quand les listes n'en ont pas assez : il retourne ce qu'il a trouvé, et isShort() le signale. Un tirage unique d'un générateur muni d'un état écarte un résultat qu'il a déjà, avec l'état que ce résultat a laissé.

Hasard et germes

Un tirage sans germe utilise le Randomizer du générateur : un moteur sûr par défaut, un moteur scénarisé ou doté d'un germe dans les tests. Un tirage avec germe utilise Xoshiro256StarStar initialisé avec le SHA-256 du germe. Le même germe, le même catalogue et la même version de PHP donnent les mêmes résultats, ce qui permet à un site de rejouer un tirage ou de le partager par son germe.

Limites

Limits arrête un générateur emballé ; au-delà d'une limite, le tirage échoue avec LimitExceeded.

LimiteValeur par défautCe qu'elle borne
depth8Les générateurs appelés les uns dans les autres, celui qui est tiré compris : un générateur qui s'appelle lui-même s'arrête.
picks1000Les tirages dans les listes, les lancers, les appels, les passages supplémentaires et les essais d'un mot inventé d'un résultat.
milliseconds250Le temps passé sur un résultat, vérifié à chaque tirage dans une liste, lancer et appel, et avant le rendu de chaque gabarit.
attempts10Les tentatives par résultat demandé à un tirage unique.
results100Les résultats demandés à un tirage.
cells2500Les cases d'une carte ou les nœuds d'un graphe.
drawMilliseconds1000Le temps passé sur tout le tirage (chaque résultat, et chaque tentative d'un tirage unique), vérifié comme le temps d'un résultat.

Chaque gabarit est compilé à la construction du générateur : la limite de temps ne compte que le tirage, et non la première compilation d'un gabarit.

Une valeur d'état plus longue que Draw::STATE_LENGTH caractères arrête aussi le tirage avec LimitExceeded, puisque le tirage suivant ne pourrait pas la rapporter.

Le temps se lit sur un Timer, par défaut SystemTimer, l'horloge monotone du système. Twig ne peut pas s'arrêter au milieu d'un gabarit : les limites de temps sont donc vérifiées avant le rendu de chaque gabarit (chaque case d'une carte, chaque champ, chaque valeur d'un état) et entre les tirages. Une boucle qui ne tire jamais s'exécute jusqu'au bout, bornée par la liste qu'elle parcourt. Le temps du tirage borne un tirage de nombreux résultats, ou un tirage unique qui retombe sans cesse sur le même : vingt cartes demandées à un tirage unique s'arrêtent après une seconde au lieu de tourner pendant dix.