Generación de números aleatorios en Ruby: Guía 2026

1 de octubre de 2025

La generación de números aleatorios es un concepto fundamental en programación, utilizado en aplicaciones que van desde las simulaciones y los juegos hasta la criptografía y el análisis estadístico. Ruby, un lenguaje de programación dinámico y orientado a objetos, proporciona herramientas robustas para generar números aleatorios. Este artículo explora las capacidades de generación de números aleatorios de Ruby, cubriendo métodos incorporados, técnicas avanzadas y aplicaciones prácticas. Nos sumergiremos en la clase Random, el método rand, seeding, secure números aleatorios ruby, y casos de uso del mundo real, garantizando una comprensión exhaustiva para desarrolladores de todos los niveles.

1. Introducción a los números aleatorios en Ruby

Los números aleatorios son esenciales en programación para tareas como la generación de identificadores únicos, la simulación de eventos impredecibles o la implementación de algoritmos criptográficos. En Ruby, la generación de números aleatorios es sencilla pero potente, gracias a sus clases y métodos incorporados. Ruby proporciona dos formas principales de generar números aleatorios:

  • El método rand, disponible en todo el mundo.
  • La clase Random, que ofrece un control preciso sobre la generación de números aleatorios.

Tanto si necesitas un simple número entero aleatorio como una cadena aleatoria criptográficamente segura, Ruby te lo pone fácil. Empecemos por lo básico.

2. En rand Método: Generación simple de números aleatorios

El rand es la herramienta más accesible de Ruby para generar números aleatorios. Está disponible globalmente, no requiere instanciación explícita de la clase. Así es como funciona:

2.1 Uso básico de rand

Sin argumentos, rand devuelve un flotante aleatorio entre 0,0 (inclusive) y 1,0 (exclusive):

ruby
puts rand # => 0.7239428374 (salida de ejemplo)

Para generar un número entero aleatorio dentro de un rango específico, pase un número entero o un rango:

ruby
puts rand(10) # => Número entero aleatorio de 0 a 9
puts rand(1..10) # => Número entero aleatorio de 1 a 10

2.2 Generación de flotantes en un intervalo

Para obtener un flotador aleatorio dentro de un rango personalizado, puede escalar la salida de rand:

rubí
mín = 5.0
máx = 10.0
random_float = min + (max - min) * rand
puts random_float # => por ejemplo, 7.29428374

2.3 Ejemplo práctico: Tirar un dado

Un caso de uso común es simular la tirada de un dado:

ruby
def rollo_muerte
rand(1..6)
end

puts tirada # => por ejemplo, 4

El rand es sencillo y suficiente para muchas aplicaciones, pero utiliza el generador global de números aleatorios de Ruby, que no siempre es ideal para aplicaciones complejas o seguras. Para un mayor control, recurrimos al método Al azar clase.

3. El Al azar Clase: Generación avanzada de números aleatorios

El Al azar introducida en Ruby 1.9, proporciona una forma más flexible y controlada de generar números aleatorios. Permite crear generadores de números aleatorios independientes, lo que resulta útil para la reproducibilidad o los procesos paralelos.

3.1 Creación de un Al azar Instancia

Puede crear un nuevo Al azar instancia con o sin semilla:

ruby
rng = Random.new
puts rng.rand # => Flotante aleatorio entre 0.0 y 1.0
puts rng.rand(10) # => Número entero aleatorio entre 0 y 9

3.2 Siembra para la reproducibilidad

Los números aleatorios en Ruby se generan utilizando un generador de números pseudoaleatorios (PRNG), concretamente el algoritmo Mersenne Twister. Un PRNG produce secuencias deterministas basadas en un valor semilla. Estableciendo una semilla, puedes asegurarte de que se genera la misma secuencia de números aleatorios:

ruby
rng = Random.new(42) # Establece la semilla en 42
puts rng.rand # => 0.3745401188473625
puts rng.rand # => 0.9507143064099162

# Misma semilla, misma secuencia
rng2 = Random.new(42)
puts rng2.rand # => 0.3745401188473625
puts rng2.rand # => 0.9507143064099162

La siembra es útil para pruebas, simulaciones o escenarios en los que se necesitan resultados reproducibles.

3.3 Generación de números con Al azar

El Al azar admite métodos similares a rand:

  • rand(max): Genera un entero aleatorio de 0 a max-1.
  • rand(rango): Genera un número entero aleatorio dentro del rango dado.
  • rand: Genera un flotador aleatorio entre 0.0 y 1.0.

Por ejemplo:

ruby
rng = Random.new
puts rng.rand(100) # => p.ej., 42
puts rng.rand(1.0..5.0) # => p.ej., 3.728493

4. Números aleatorios seguros con SecureRandom

Para las aplicaciones que requieren números aleatorios criptográficamente seguros, como la generación de tokens, contraseñas o claves de cifrado, la tecnología Ruby SecureRandom es la mejor opción. A diferencia de rand o Al azar, que utilizan el Twister de Mersenne (predecible si se conoce la semilla), SecureRandom utiliza la aleatoriedad a nivel de sistema (por ejemplo, /dev/urandom en sistemas tipo Unix).

4.1 Utilización SecureRandom

El SecureRandom proporciona métodos para generar bytes, cadenas y números aleatorios. Requerirlo antes de su uso:

ruby
require 'securerandom'

4.1.1 Generación de bytes aleatorios

ruby
bytes = SecureRandom.random_bytes(16) # => 16 bytes aleatorios
puts bytes.inspeccionar

4.1.2 Generar cadenas hexadecimales

ruby
hex = SecureRandom.hex(8) # => cadena hexadecimal de 16 caracteres
puts hex # => por ejemplo, "a1b2c3d4e5f6g7h8"

4.1.3 Generar cadenas Base64

ruby
base64 = SecureRandom.base64(12) # => Cadena aleatoria codificada en Base64
puts base64 # => por ejemplo, "XjY2Nzg5MDEyMzQ="

4.1.4 Generar UUIDs

ruby
uuid = SecureRandom.uuid # => e.g., "550e8400-e29b-41d4-a716-446655440000"
puts uuid

4.1.5 Generación de números aleatorios

ruby
number = SecureRandom.random_number(100) # => Número entero aleatorio de 0 a 99
puts número

4.2 Cuándo utilizarlo SecureRandom

Utilice SecureRandom para:

  • Generación de claves API o testigos de sesión.
  • Crear contraseñas seguras.
  • Operaciones criptográficas que requieren una entropía elevada.
  • Cualquier escenario en el que la previsibilidad pueda comprometer la seguridad.

Evite SecureRandom para tareas no críticas para la seguridad, ya que es más lento que rand o Al azar.

5. Aplicaciones prácticas de los números aleatorios en Ruby

Exploremos casos de uso reales para ver cómo brilla la generación de números aleatorios de Ruby.

5.1 Barajar matrices

Barajar aleatoriamente una matriz es una tarea habitual en juegos, concursos o muestreos. Ruby Matriz#shuffle utiliza el generador global de números aleatorios, pero puede pasar un método Al azar para el control:

rubí
números = [1, 2, 3, 4, 5]
rng = Random.new(42)
puts números.barajar(aleatorio: rng) # => [4, 2, 5, 1, 3]

5.2 Generación de cadenas aleatorias

Para generar cadenas alfanuméricas aleatorias (por ejemplo, para ID temporales), puede combinar rand o SecureRandom con un juego de caracteres:

ruby
chars = ('a'..'z').to_a + ('0'..'9').to_a
random_string = 8.times.map { chars[rand(chars.length)] }.join
puts cadena_aleatoria # => e.g., "k7n4p8m2"

# Utilización de SecureRandom para la seguridad
secure_string = SecureRandom.alphanumeric(8)
puts cadena_segura # => p.ej., "Kj9mP2vN"

5.3 Simulación de sucesos aleatorios

Los números aleatorios son ideales para simulaciones, como modelar el lanzamiento de una moneda:

ruby
def moneda_lanzamiento
  rand(2) == 0 ? "Cara" : "Cruz"
end

10.times { puts coin_flip }  # Simula 10 lanzamientos de moneda

5.4 Generación de datos de prueba

Al probar aplicaciones, los datos aleatorios pueden simular la entrada del usuario:

ruby
require 'securerandom'

def generar_usuario
  {
    id: SecureRandom.uuid,
    edad: rand(18..80),
    correo electrónico: "usuario#{rand(1000)}@ejemplo.com"
  }
end

puts generar_usuario.inspeccionar

5.5 Muestreo aleatorio

Ruby's Matriz1TP5Muestra selecciona elementos aleatorios de una matriz, opcionalmente utilizando un método Al azar instancia:

rubí
items = %w[manzana plátano cereza dátil]
rng = Random.new
puts items.sample(2, random: rng) # => e.g., ["plátano", "fecha"]

6. Consideraciones sobre el rendimiento

Aunque la generación de números aleatorios de Ruby es eficiente para la mayoría de las tareas, hay compensaciones de rendimiento:

  • Global rand: El más rápido para uso general, ya que utiliza el PRNG global.
  • Clase aleatoria: Ligeramente más lento debido a la gestión de instancias, pero ofrece un mejor control.
  • SecureRandom: El más lento debido a su dependencia de la aleatoriedad a nivel de sistema, adecuado sólo para tareas críticas de seguridad.

En el caso de las aplicaciones de rendimiento crítico, realice una evaluación comparativa de su código con la herramienta de Ruby Punto de referencia módulo:

ruby
require 'benchmark'

n = 1_000_000
Benchmark.bm do |x|
  x.report("rand:") { n.times { rand(100) } }
  x.report("Random:") { rng = Random.new; n.times { rng.rand(100) } }
  x.report("SecureRandom:") { n.times { SecureRandom.random_number(100) } }
end

Ejemplo de salida:
      usuario sistema total real
rand: 0.120000 0.000000 0.120000 ( 0.123456)
aleatorio: 0,150000 0,000000 0,150000 ( 0,154321)
SecureRandom: 2,500000 0,010000 2,510000 ( 2,543210)

7. Mejores prácticas y consejos para números aleatorios en Ruby

  • Elija la herramienta adecuada: Utilice rand para tareas sencillas, Al azar para secuencias controladas, y SecureRandom para aplicaciones críticas de seguridad.
  • Sembrar con inteligencia: Utilice semillas para la reproducibilidad en las pruebas, pero evítelas en la producción a menos que sea necesario.
  • Evitar la previsibilidad: No utilizar nunca rand o Al azar con fines criptográficos, ya que sus secuencias pueden predecirse si se conoce la semilla.
  • Prueba de aleatoriedad: Para aplicaciones estadísticas, verifique la distribución de sus números aleatorios utilizando bibliotecas como distribución o pruebas estadísticas.
  • Seguridad: El mundo rand no es seguro para los hilos. Utilice un método Al azar instancias para cada hilo en aplicaciones multihilo.

8. Números aleatorios avanzados de Ruby

8.1 Generadores de números aleatorios personalizados

Puede implementar su propio PRNG subclasificando Random::Formateador o utilizando bibliotecas externas como aleatorio/ran para algoritmos especializados.

8.2 Aleatoriedad estadística

Para aplicaciones que requieran distribuciones específicas (por ejemplo, la gaussiana), considere gemas como distribución:

ruby
require 'distribución
rng = Distribución::Normal.rng
puts rng.call # => Número aleatorio de una distribución normal

8.3 Mejoras criptográficas

Para necesidades criptográficas avanzadas, combine SecureRandom con bibliotecas como abresl para tareas como la generación de claves o las firmas digitales.

9. Conclusión

Las capacidades de generación de números aleatorios de Ruby son versátiles y satisfacen una amplia gama de necesidades, desde la simple generación de enteros con rand para asegurar criptográficamente cadenas con SecureRandom. Al comprender la Al azar clase, siembra y generación aleatoria segura, los desarrolladores pueden crear aplicaciones robustas para simulaciones, juegos, pruebas, y seguridad. Tanto si se trata de lanzar un dado virtual como de generar un token de API seguro, Ruby proporciona las herramientas para hacerlo de forma eficiente y fiable.

Siguiendo las mejores prácticas y eligiendo el método apropiado para tu caso de uso, puedes aprovechar el poder de la aleatoriedad en Ruby para crear aplicaciones dinámicas, impredecibles y seguras. Experimenta con los ejemplos proporcionados y explora la documentación de Ruby para profundizar en sus capacidades de generación de números aleatorios.

En Carmatec, Nuestros expertos en Ruby on Rails aprovechan estas capacidades para crear aplicaciones escalables, seguras y de alto rendimiento. En soluciones empresariales a API personalizadas, garantizamos la aplicación de las técnicas de aleatorización adecuadas para mejorar la seguridad, el rendimiento y la fiabilidad, ayudando a las empresas a innovar con confianza.