Generador pseudoaleatorio
Hay muchas áreas en las que necesitamos datos aleatorios.
Uno de ellos es para testeo. Es posible que necesitemos datos aleatorios: texto, números, etc. para probar bien las cosas.
En JavaScript, podríamos usar Math.random()
. Pero si algo sale mal, nos gustaría poder repetir la prueba utilizando exactamente los mismos datos.
Para eso, se utilizan los denominados “generadores pseudoaleatorios con semilla”. Toman una “semilla” como primer valor, y luego generan los siguientes utilizando una fórmula; a partir de la misma semilla se produce la misma secuencia y así todo el flujo es fácilmente reproducible. Solo necesitamos recordar la semilla para repetirla.
Un ejemplo de dicha fórmula, que genera valores distribuidos de manera algo uniforme:
next = previous * 16807 % 2147483647
Si nosotros usamos 1
como semilla, los valores serán:
16807
282475249
1622650073
- …y así…
La tarea es crear una función generadora pseudoRandom (seed)
que toma seed
y crea el generador con esta fórmula.
Ejemplo de uso
let generator = pseudoRandom(1);
alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073
function* pseudoRandom(seed) {
let value = seed;
while(true) {
value = value * 16807 % 2147483647;
yield value;
}
};
let generator = pseudoRandom(1);
alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073
Tenga en cuenta que se puede hacer lo mismo con una función regular, como esta:
function pseudoRandom(seed) {
let value = seed;
return function() {
value = value * 16807 % 2147483647;
return value;
}
}
let generator = pseudoRandom(1);
alert(generator()); // 16807
alert(generator()); // 282475249
alert(generator()); // 1622650073
Eso también funciona. Pero entonces perdemos la capacidad de iterar con for..of
y usar la composición del generador, que puede ser útil en otros lugares.