Je cherche un générateur de nombres pseudo-aléatoires qui serait spécialisée pour travailler rapidement quand il est donné une graine avant de générer chaque numéro. La plupart des générateurs que j'ai vus jusqu'à présent supposent que vous avez mis une graine une fois et ensuite générer une longue séquence de nombres. La seule chose qui ressemble un peu à ce que j'ai vu jusqu'ici est Perlin Noise, mais elle génère des données trop "lisses" - pour des entrées similaires, elle tend à produire des résultats similaires.générateur pseudo-aléatoire rapide pour le contenu de la procédure
La déclaration du générateur devrait ressembler à:
int RandomNumber1(int seed);
Ou:
int RandomNumber3(int seedX, int seedY, int seedZ);
Je pense avoir une bonne RandomNumber1 devrait être suffisante, car il est possible de mettre en œuvre RandomNumber3 en hachant ses entrées et en passant le résultat dans le RandomNumber1, mais j'ai écrit le deuxième prototype au cas où une implémentation pourrait utiliser les entrées indépendantes. L'utilisation prévue pour ce générateur est de l'utiliser pour le générateur de contenu procédural, comme la génération d'une forêt en plaçant des arbres dans une grille et en déterminant une espèce d'arbre aléatoire et des décalages spatiaux aléatoires pour chaque emplacement.
Le générateur doit être très efficace (moins de 500 cycles CPU), parce que le contenu de la procédure est créée en quantités énormes en temps réel pendant le rendu.
La raison pour laquelle le bruit Perlin est semblable à ce que vous demandez est que le bruit Perlin utilise une fonction pseudo-aléatoire déterministe (reproductible) pour faire partie de son travail (et aplanit le résultat). Si vous regardez une implémentation de bruit Perlin, en particulier les plus anciennes, vous trouverez souvent le type de fonction "aléatoire" efficace et reproductible que vous recherchez, bien que le langage, le domaine et la portée varient. Par exemple. 'RandomNumber (graine vec2, float x, flottant y) {return fract (sin (point (graine + vec2 (fx, fy), vec2 (12.9898,78.233))) * 43758.5453); } '(GLSL ES) – LarsH
J'ai aussi essayé de faire une recherche sur cette question, et je suis arrivé à la conclusion que le mot« générateur »implique le comportement séquentiel en continu que nous essayons d'éviter. C'est pourquoi un PRN ** G ** est généralement compris comme fournissant des «fonctions» dynamiques, pas strictement déterministes. Peut-être que nous aurions un meilleur succès dans la recherche si nous recherchions PRNF (fonction) plutôt que PRNG. https://blogs.unity3d.com/2015/01/07/a-primer-on-repeatable-random-numbers/ les appelle "fonctions de hachage aléatoires". – LarsH