Generación de números aleatorios en Swift: de random() a GameplayKit

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Swift y los números aleatorios: magia que funciona de forma predecible

\n\n

Todo desarrollador, tarde o temprano, se enfrenta a la tarea: «¿Cómo generar un número aleatorio?». Parecería que no podría ser más simple. Pero en el mundo de Swift, este tema ha recorrido un largo camino de evolución, desde las antiguas funciones de C hasta la elegante API integrada. En este artículo, analizaremos todas las formas de generar números aleatorios en Swift, desde las simples hasta las industriales, con ejemplos prácticos y matices importantes.

\n\n

Si alguna vez te has preguntado por qué tu arc4random() devuelve números extraños o cómo hacer una verdadera selección aleatoria de un array, has llegado al lugar indicado. ¡Allá vamos!

\n\n

Breve historia: cómo llegamos hasta aquí

\n\n

Antes de Swift 4.2 (2018), los desarrolladores elegían con dificultad entre arc4random(), drand48() y soluciones improvisadas como rand() % 100. Este último, por cierto, era peligroso: sesgo (bias) en la distribución garantizado si el rango no es divisible exactamente por RAND_MAX. Con el lanzamiento de Swift 4.2, Apple nos regaló el protocolo RandomNumberGenerator y métodos integrados. Ahora la generación de números aleatorios es segura, legible y uniforme.

\n\n

La forma moderna: RandomNumberGenerator y métodos de tipo

\n\n

A partir de Swift 4.2, la forma más correcta y sencilla es usar métodos estáticos en los tipos:

\n\n
// Número entero aleatorio del 1 al 100\nlet randomInt = Int.random(in: 1...100)\n\n// Número de punto flotante aleatorio de 0.0 a 1.0\nlet randomDouble = Double.random(in: 0.0...1.0)\n\n// Número Float aleatorio\nlet randomFloat = Float.random(in: 0.0...1.0)\n\n// Bool aleatorio\nlet randomBool = Bool.random()\n
\n\n

Esta API utiliza el generador del sistema SystemRandomNumberGenerator, que es criptográficamente seguro (pero hablaremos de eso más adelante). Importante: el rango se especifica mediante un closed range (...) o un half-open range (..<).

\n\n

¿Por qué es genial?

\n
    \n
  • Seguridad de tipos — el compilador no te permitirá generar un Double y asignarlo a un Int.
  • \n
  • Sin sesgo — Swift se encarga de la uniformidad de la distribución.
  • \n
  • Versatilidad — funciona para todos los tipos numéricos: Int, UInt, Int8, Float, Double, CGFloat e incluso Bool.
  • \n
\n\n

Generación de un número aleatorio de un rango: trampas

\n\n

Parecería que nada puede salir mal. Veamos un ejemplo:

\n\n
let diceRoll = Int.random(in: 1...6)  // Dado: 1,2,3,4,5,6\nlet coinFlip = Int.random(in: 0..<2)  // Moneda: 0 o 1\n
\n\n

Todo correcto. Pero si quieres generar un número aleatorio sin límite superior (por ejemplo, de 0 a infinito), no es posible. Swift requiere especificar explícitamente el rango. Esto se hizo a propósito para evitar errores de desbordamiento.

\n\n

Si necesitas un número aleatorio de 0 a max (donde max es una variable), simplemente usa:

\n\n
let maxValue = 500\nlet randomUpTo = Int.random(in: 0...maxValue)\n
\n\n

Elemento aleatorio de una colección (Array, Set, Dictionary)

\n\n

La generación de un número aleatorio a menudo no se necesita por sí misma, sino para seleccionar un elemento aleatorio. Swift proporciona una solución elegante:

\n\n
let fruits = ["manzana", "plátano", "cereza", "melón"]\nif let randomFruit = fruits.randomElement() {\n    print("Hoy comemos \\(randomFruit)")\n} else {\n    print("¡La cesta está vacía!")\n}\n
\n\n

El método randomElement() devuelve un valor opcional; esto es importante porque la colección puede estar vacía. Para mezclar todo el array, usa shuffled():

\n\n
let shuffledFruits = fruits.shuffled()\nprint(shuffledFruits) // por ejemplo: ["plátano", "melón", "manzana", "cereza"]\n
\n\n

Generación criptográficamente segura: cuando la seguridad es lo primero

\n\n

El I

Blogs

Book Recommendations