JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
Loading...
Searching...
No Matches
core::DeterministicRandom Class Reference

Générateur pseudo-aléatoire léger (SplitMix64), à graine explicite. More...

#include <DeterministicRandom.h>

Public Member Functions

 DeterministicRandom (std::uint64_t seed) noexcept
std::uint32_t nextUInt32 () noexcept
float nextFloat01 () noexcept
float nextRange (float min, float max) noexcept
 Prochain flottant dans [min, max].
int nextInt (int min, int max) noexcept
 Prochain entier dans [min, max], bornes comprises, sans biais modulo.

Private Attributes

std::uint64_t _state

Detailed Description

Générateur pseudo-aléatoire léger (SplitMix64), à graine explicite.

Aucune dépendance à <random> ni à l'horloge système : deux instances construites avec la même graine produisent exactement la même suite de valeurs (EX-NFR-002). Utilisé par core::ParticleSystem (LOT-53), où tout tirage doit rester reproductible d'une exécution à l'autre pour une même séquence d'entrées.

Constructor & Destructor Documentation

◆ DeterministicRandom()

core::DeterministicRandom::DeterministicRandom ( std::uint64_t seed)
inlineexplicitnoexcept
Parameters
seedGraine explicite (jamais issue de l'horloge ou d'un générateur par défaut).

Member Function Documentation

◆ nextFloat01()

float core::DeterministicRandom::nextFloat01 ( )
inlinenodiscardnoexcept
Returns
Le prochain flottant dans [0, 1[.

◆ nextInt()

int core::DeterministicRandom::nextInt ( int min,
int max )
inlinenodiscardnoexcept

Prochain entier dans [min, max], bornes comprises, sans biais modulo.

nextUInt32() % n est la forme évidente, et elle est fausse : 2³² n'est pas un multiple de n, si bien que les 2³² mod n premières valeurs sortent une fois de plus que les autres. Sur un d20 le biais est d'environ un dix-millionième — négligeable —, mais il est systématique et va toujours dans le même sens, et il rendrait indéfendable toute mesure de distribution faite sur ce générateur. Le corriger coûte une boucle qui ne tourne pratiquement jamais.

La méthode est celle du rejet : on écarte la queue de l'intervalle qui dépasse le dernier multiple complet de n. Le nombre d'itérations est fini avec probabilité 1, et sa moyenne est inférieure à 2 pour tout n réaliste.

Parameters
minBorne inférieure, comprise.
maxBorne supérieure, comprise. Si max <= min, renvoie min sans tirer — un intervalle vide n'est pas une erreur, c'est une valeur fixe.
Returns
L'entier tiré.

◆ nextRange()

float core::DeterministicRandom::nextRange ( float min,
float max )
inlinenodiscardnoexcept

Prochain flottant dans [min, max].

Parameters
minBorne inférieure.
maxBorne supérieure ; si égale à min, renvoie exactement min (aucun tirage discriminant, utile pour une durée de vie ou une vitesse fixe).
Returns
La valeur tirée.

◆ nextUInt32()

std::uint32_t core::DeterministicRandom::nextUInt32 ( )
inlinenodiscardnoexcept
Returns
Le prochain entier 32 bits de la suite.

Member Data Documentation

◆ _state

std::uint64_t core::DeterministicRandom::_state
private

The documentation for this class was generated from the following file: