random00
Un generador de números al azar es una instrucción que tienen muchos lenguajes de programación. Quienes llevan tiempo programando saben que la función de números aleatorios es en realidad pseudo-aleatoria. Hay algoritmos que, dado un número semilla, se genera una secuencia de números que presumiblemente son al azar y para la mayoría de los casos funcionan. Sin embargo, azaroso, lo que se dice completamente azaroso, no lo es.

Los números al azar se usan en muchos programas, desde juegos hasta simulaciones del mundo real. Muchos lenguajes, por ejemplo Javascript, tiene una función como Math.Random() que genera dichos números. Normalmente las funciones azarosas de los lenguajes ya están optimizadas y la velocidad de generación en ocasiones es importante. En Chrome 49, por ejemplo, el motor V8 de Javascript usaba una manera específica de generar los números al azar, llamada MWC1616 (multiplica con acarreo, combinando las dos partes de 16 bits). Pero esto tiene sus problemas y simplemente falla en las pruebas estándar (que muchas veces se usan como medida comparativa para las funciones de todos los lenguajes).

Si se quiere probar qué tan azarosa es la función “random”, se puede hacer una prueba gráfica: genérese un número al azar, y para cada punto X y Y de la pantalla, grafíquese. En un esquema de azar ideal, los puntos se distribuirán sin dejar bandas o tendencias a ellas. Puede verse que si una función genera ciertas bandas o tendencias claras y esto, por ejemplo, no es una buena idea que ocurra en un juego de la ruleta o en el poker computarizado. La idea del azar es que la siguiente carta, o el siguiente número que saldrá en la ruleta, no se puedan predecir.

azar00

El equipo del motor Javascript V8 en Chrome ha arreglado el problema cambiando el algoritmo MWC16126 por xorshift128+, una receta alternativa que pasa todas las pruebas estándar. La imagen presenta, en la parte izquierda, el algoritmos MWC1616 y a la derecha el nuevo algoritmo xorshift128+.

Más información sobre el cambio del generador de números al azar en V8 puede verse en el blog que anuncia precisamente esto (ver referencias).

Referencias:

There’s Math.random(), and then there’s Math.random() 

i-programmer

Enlaces Patrocinados
Comentarios