Prefacio
En el desarrollo frontal, especialmente el desarrollo de juegos, a menudo se usan números aleatorios, por lo que pensaremos en: Math.random , echemos un vistazo al siguiente código:
for (var i = 0; i <10; i ++) {document.writeLn (math.random ()+<Br />); }Ejecutar el código anterior genera 10 números diferentes. Por supuesto que puedes generar más, lo que se ve bastante bien. Si eso es todo, entonces no hay necesidad de escribir este artículo.
Ejemplo
Intenta pensar en ello. Si hacemos un juego en un determinado escenario y el usuario sale a la mitad de la jugada, para que el usuario pueda optar por continuar el progreso anterior la próxima vez que entra. Entonces el problema ahora es: podemos registrar datos de descripción simples, como el progreso de juego del usuario y el progreso del usuario, pero los obstáculos, los objetos voladores y muchos gadgets decorativos dibujados, etc., incluso comienzan a emitir el azar cada vez que los puntos del usuario comienzan a todo en todo en la lata de los objetos de Canvas, que, en el que se encuentran el juego, en el juego, que en el juego, que en el juego, que en el que se producen en el juego, que en el que se encuentran en el Juego, que, en el que se encuentran en el Juego, en el que se encuentran en el Juego, que en el juego, su tamaño, en el que se encuentran en el juego. innecesario.
Entonces aparece el número de semilla aleatoria. Si tenemos un valor de semilla cuando el elemento se dibuja aleatoriamente en el lienzo, y la posición, el tamaño, etc. de todos los elementos en la página se calculan en función de esta semilla, luego, cuando se dibuja el segundo dibujo, solo necesitamos pasar en esta semilla para reproducir los elementos de lona previamente inacabados.
Luego, en este momento, encontrará que el Math.random que viene con JS no funciona bien y no puede satisfacer las necesidades. Sigamos mirando este código:
La copia del código es la siguiente:
Math.Seed = 5; Math.seedrandom = function (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); }; for (var i = 0; i <10; i ++) {document.writeLn (math.seedrandom ()+<Br />); }
Ejecute el código anterior y encontrará que si la semilla Math.Seed permanece sin cambios, el número aleatorio generado no cambiará. Oh, si se introduce esta función, se puede lograr la reproducción de la escena del juego. Aunque se requieren más detalles, se puede garantizar el mecanismo. El enfoque de este artículo no es implementar un juego de este tipo.
El enfoque de este artículo es : (Math.Seed * 9301 + 49297) % 233280 , ¿por qué estos tres valores, no otros, y qué orígenes misteriosos tienen estos tres números?
Un generador de números pseudo-aleatorio como Math.seedrandom se llama generador congruente lineal (LCG, generador congruencial lineal). Casi todos los rands proporcionados por la biblioteca de tiempo de ejecución usan LCG, que es como:
I n+1 = ai n+c (mod m)
El período máximo M de la secuencia de número de pseudo-aleatorio generado es entre 0 y M-1. Para lograr este ciclo máximo, es necesario cumplir:
1.C y M son mutuamente excluyentes
2.A - 1 se puede dividir por todos los factores primos de M
3. Si M es un múltiplo de 4, A - 1 también debe ser un múltiplo de 4
Los tres anteriores se llaman teorema de casco-Dobell. Como generador de números pseudo-aleatorios, es vergonzoso quedarse atascado si el ciclo no es lo suficientemente grande, por lo que este es uno de los requisitos. Por lo tanto, los siguientes son: A = 9301, C = 49297, M = 233280. Todos los tres elementos anteriores están satisfechos.
Resumir
Lo anterior es una introducción a cómo implementar y funcionar números aleatorios de semillas en JS. Espero que sea útil para los alumnos de JavaScript.