A raiz de un antiguo código C, que implementaba de forma simple un generador de números aleatorios, donde lo que primaba era el rendimiento, he decidido portarlo a ActionScript 3, para ver como ser comportaba al compararlo con el Math.random() incorporado.

He creado una función llamada FastRandom, que recibe dos enteros, que representan el intervalo mínimo y máximo sobre el que queremos sacar el número. Por eficiencia, y porque de hecho es lo que normalmente necesitamos, la función trabaja con números enteros. De hecho son enteros sin signo, aunque como ya vimos, parece que a la máquina virtual de Flash le gustan más con signo, por lo que para él, son con signo.

El código, tiene esta pinta:


var giSeed: int=getTimer();

function FastRandom(piMin: int, piMax: int): int
{
giSeed=36969*(giSeed&32767)+(giSeed>>16);
return((giSeed%(piMax-piMin))+piMin);
}

Tras haberlo ejecutado en un Athlon XP 2400+, el tiempo empleado en generar 10 millones de números aleatorios ha sido:
– Math.random(): 4.825 ms.
– FastRandom(): 1.529 ms.

Así las cosas, vemos que mi implementación, es más del doble de rápida que la de referencia, lo cual, aunque esperase mucho más, no es poco en absoluto.

No obstante, y para ser justos, la prueba, otorga algo de ventaja a Flash, pues este ya lleva incorporado el valor de 900, es decir, se ha ahorrado en cada iteración la resta entre 1000 y 100.

Desde mi punto de vista, la generación de números aleatorios, es un proceso bastante común en la mayoría de programas Flash, lo que posiblemente ha hecho que la gente de Adobe ponga un énfasis especial en las optimizaciones de éste método.

Está claro que el método puede optimizarse todavía más, haciendo que los números aleatorios se generen en grupos, y se introduzcan en una tabla. No obstante esto, complicaría el algoritmo, y en todo caso, queda pendiente para futuras entregas.

Si lo deseas, puedes descargar el fuente y el binario aquí (6 Kb. en formato ZIP).