Préface
Dans le développement frontal, en particulier le développement de jeux, des nombres aléatoires sont souvent utilisés, nous allons donc penser à: Math.random , jetons un coup d'œil au code suivant:
pour (var i = 0; i <10; i ++) {document.writeln (math.random () + <br />); }L'exécution du code ci-dessus génère 10 nombres différents. Bien sûr, vous pouvez en générer plus, ce qui a l'air plutôt bien. Si c'est tout, il n'est pas nécessaire d'écrire cet article.
Exemple
Essayez d'y penser. Si nous faisons un jeu dans un certain scénario et que l'utilisateur sort à mi-chemin de la pièce, afin que l'utilisateur puisse choisir de poursuivre les progrès précédents la prochaine fois qu'il arrive. Ensuite, le problème est maintenant: nous pouvons enregistrer des données de description simples telles que les progrès de l'utilisateur et les points d'utilisateur, mais les obstacles, les objets volants et de nombreux gadgets décoratifs tirés dans le jeu, ils commencent à sortir aléatoire inutile.
Ainsi, le nombre de graines aléatoires apparaît. Si nous avons une valeur de graines lorsque l'élément est dessiné au hasard sur la toile, et la position, la taille, etc. de tous les éléments de la page sont calculées sur la base de cette graine, alors lorsque le deuxième dessin est dessiné, nous devons passer dans cette graine pour reproduire les éléments de toile précédemment inachevés.
Ensuite, pour le moment, vous constaterez que le random mathématique qui vient avec JS ne fonctionne pas bien et ne peut pas répondre aux besoins. Continuons à regarder ce code:
La copie de code est la suivante:
Math.seed = 5; Math.seedrandom = fonction (max, min) {max = max || 1; min = min || 0; Math.seed = (math.seed * 9301 + 49297)% 233280; var rnd = math.seed / 233280.0; return min + rnd * (max - min); }; pour (var i = 0; i <10; i ++) {document.writeln (math.seedrandom () + <br />); }
Exécutez le code ci-dessus et vous constaterez que si la graine de graine reste inchangée, le nombre aléatoire généré ne changera pas. Oh, si cette fonction est introduite, la reproduction de la scène du jeu peut être réalisée. Bien que plus de détails soient nécessaires, le mécanisme peut être garanti. L'objectif de cet article n'est pas de mettre en œuvre un tel jeu.
L'objectif de cet article est : (Math.seed * 9301 + 49297)% 233280 , pourquoi ces trois valeurs, pas les autres, et quelles origines mystérieuses font ces trois nombres?
Un générateur de nombres pseudo-aléatoires comme math.seedrandom est appelé générateur congruente linéaire (LCG, générateur congruentiel linéaire). Presque tous les Rands fournis par la bibliothèque d'exécution utilisent LCG, ce qui est comme:
I n + 1 = ai n + c (mod m)
La période maximale m de la séquence de nombres pseudo-aléatoires générée se situe entre 0 et M-1. Pour atteindre ce cycle maximal, il est nécessaire de se rencontrer:
1.C et M s'excluent mutuellement
2.A - 1 peut être divisé par tous les principaux facteurs de m
3. Si m est un multiple de 4, A - 1 doit également être un multiple de 4
Les trois ci-dessus sont appelés théorème de Hull-Dobell. En tant que générateur de nombres pseudo-aléatoires, il est embarrassant de rester coincé si le cycle n'est pas assez grand, c'est donc l'une des exigences. Par conséquent, les éléments suivants sont les suivants: A = 9301, C = 49297, M = 233280. Tous les trois éléments ci-dessus sont satisfaits.
Résumer
Ce qui précède est une introduction à la façon d'implémenter et de fonctionner des nombres aléatoires de graines dans JS. J'espère que cela sera utile aux apprenants JavaScript.