Si bien ninguna computadora puede generar números verdaderamente aleatorios, Ruby proporciona acceso a un método que devolverá pseudoaleatorio números.
Ninguna computadora puede generar realmente números al azar puramente por computación. Lo mejor que pueden hacer es generar pseudoaleatorio números, que son una secuencia de números que Aparecer al azar pero no lo son.
Para un observador humano, estos números son de hecho aleatorios. No habrá secuencias repetidas cortas y, al menos para el observador humano, no presentarán un patrón claro. Sin embargo, dado suficiente tiempo y motivación, el original semilla puede ser descubierto, la secuencia recreada y el siguiente número en la secuencia adivinado.
Por esta razón, los métodos discutidos en este artículo probablemente no deberían usarse para generar números que deben ser criptográficamente seguros.
Los generadores de números pseudoaleatorios deben ser sembrado para producir secuencias que difieren cada vez que se genera un nuevo número aleatorio. Ningún método es mágico: estos números aparentemente aleatorios se generan utilizando algoritmos relativamente simples y aritmética relativamente simple. Al sembrar el PRNG, está comenzando en un punto diferente cada vez. Si no lo sembró, generaría la misma secuencia de números cada vez.
En Ruby, el Kernel # srand Se puede llamar al método sin argumentos. Escogerá una semilla de número aleatorio en función del tiempo, la ID del proceso y un número de secuencia. Simplemente llamando srand en cualquier lugar al comienzo de su programa, generará una serie diferente de números aparentemente aleatorios cada vez que lo ejecute. Este método se llama implícitamente cuando se inicia el programa, y siembra el PRNG con el tiempo y la identificación del proceso (sin número de secuencia).
Una vez que el programa se está ejecutando y Kernel # srand fue llamado implícita o explícitamente, el Kernel # rand Se puede llamar al método. Este método, llamado sin argumentos, devolverá un número aleatorio de 0 a 1. En el pasado, este número generalmente se escalaba al número máximo que desea generar y tal vez to_i llamado para convertirlo en un entero.
Sin embargo, Ruby hace las cosas un poco más fáciles si está usando Ruby 1.9.x. los Kernel # rand El método puede tomar un solo argumento. Si este argumento es un Numérico de cualquier tipo, Ruby generará un número entero desde 0 hasta (y sin incluir) ese número.
Sin embargo, ¿qué pasa si desea generar un número del 10 al 15? Por lo general, generaría un número de 0 a 5 y lo agregaría a 10. Sin embargo, Ruby lo hace más fácil.
Asegúrese de prestar atención a los dos tipos de rangos. Si llamaste rand (10..15), eso generaría un número de 10 a 15 incluso 15. Mientras rand (10... 15) (con 3 puntos) generaría un número de 10 a 15 No incluído 15.
A veces necesita una secuencia de números de aspecto aleatorio, pero debe generar la misma secuencia cada vez. Por ejemplo, si genera números aleatorios en una prueba unitaria, debe generar la misma secuencia de números cada vez.
Una prueba unitaria que falla en una secuencia debería fallar nuevamente la próxima vez que se ejecute, si genera una secuencia de diferencia la próxima vez, podría no fallar. Para hacer eso, llama Kernel # srand con un valor conocido y constante
La implementación de Kernel # rand es más bien no rubí. No abstrae el PRNG de ninguna manera, ni le permite instanciar el PRNG. Hay un estado global para el PRNG que comparte todo el código. Si cambia la semilla o cambia el estado de la PRNG, puede tener un rango de efecto más amplio de lo que esperaba.
Sin embargo, dado que los programas esperan que el resultado de este método sea aleatorio, ¡ese es su propósito! - Esto probablemente nunca será un problema. Solo si el programa espera ver una secuencia esperada de números, como si hubiera llamado srand con un valor constante, si ve resultados inesperados.