Mezclar líneas

Reordena líneas al azar (Fisher-Yates) en local.

Descripción

Mezclar datos al azar es más difícil de lo que parece. El algoritmo más ingenuo — generar un número aleatorio para cada elemento y ordenar por ese valor — produce distribuciones sesgadas en las que ciertas posiciones aparecen con más frecuencia de la debida. El Fisher-Yates shuffle, formalizado por Ronald Fisher y Frank Yates en 1938 y popularizado en su versión informática por Richard Durstenfeld en 1964, lo resuelve de forma elegante: recorre la lista de atrás hacia adelante e intercambia cada elemento con uno elegido al azar entre los que aún no se han procesado. El resultado es una permutación verdaderamente uniforme en O(n).

La calidad de la aleatoriedad depende del generador utilizado. Math.random() en los motores JavaScript modernos usa algoritmos como xorshift128+ y produce números suficientemente impredecibles para casos de uso habituales: mezclar tarjetas de estudio, aleatorizar el orden de preguntas, crear muestras para pruebas manuales. Para sorteos con requisitos legales o de auditoría — rifas, competiciones deportivas, decisiones de gobernanza — la fuente correcta es la Web Crypto API: window.crypto.getRandomValues() usa la entropía del sistema operativo y es criptográficamente sólida.

Existe una paradoja interesante en la percepción humana de la aleatoriedad. Cuando Spotify lanzó el shuffle verdaderamente aleatorio en sus listas de reproducción, los usuarios se quejaban de que no funcionaba porque las canciones del mismo artista aparecían seguidas con frecuencia, lo cual es estadísticamente esperado en una distribución uniforme. Para que pareciera más aleatorio a las personas, Spotify tuvo que hacer el shuffle deliberadamente menos aleatorio, garantizando mayor espaciado entre artistas. La percepción humana del azar es profundamente no uniforme.

Detalle técnico

Aplicaciones prácticas de la mezcla

  • Tarjetas de estudio y aprendizaje: mezclar una lista de palabras, fórmulas o preguntas antes de cada sesión de estudio evita que el cerebro memorice la secuencia en lugar del contenido.
  • Exámenes y cuestionarios: aleatorizar el orden de las preguntas y las opciones de respuesta reduce las trampas y garantiza que distintas versiones del mismo examen sean equivalentes en dificultad.
  • Listas de reproducción y sistemas de recomendación: seleccionar aleatoriamente un subconjunto de elementos de una lista mayor para mostrar es una operación de muestreo sin reposición que Fisher-Yates ejecuta con eficiencia.
  • División de conjuntos de datos en aprendizaje automático: mezclar los datos antes de dividirlos en conjuntos de entrenamiento, validación y prueba evita el sesgo de ordenación que distorsiona las métricas del modelo.
  • Sorteos y juegos: determinar el orden de jugadores, cartas o premios con una fuente de aleatoriedad fiable, registrando la semilla para auditoría posterior si es necesario.

Math.random() frente a window.crypto.getRandomValues()

  • Math.random() es suficiente para mezclar tarjetas de estudio, aleatorizar listas de visualización y pruebas de interfaz. Es rápido y está disponible en todos los contextos JavaScript.
  • window.crypto.getRandomValues() usa la entropía del sistema operativo (ruido de hardware, tiempos de interrupción) y es criptográficamente adecuado para sorteos con valor real.
  • La diferencia práctica: si un adversario puede observar los resultados anteriores de Math.random() y conoce el algoritmo, en teoría puede predecir los valores futuros. getRandomValues() no tiene ese problema.
  • Para uso en Node.js, el equivalente es crypto.getRandomValues() o crypto.randomBytes(). En Python, usa random.shuffle() para casos simples y el módulo secrets para aplicaciones con requisitos de seguridad.

Guía de la herramienta

  • Con qué trabajas Una lista en texto, una entrada por línea.

  • Qué hace la herramienta Reordena líneas al azar (barajado estilo Fisher–Yates con aleatoriedad del navegador).

  • Por qué usarla Sorteos informales, orden aleatorio para ideas A/B manuales, romper el sesgo de un orden fijo de lista.

Fragmentos de Código

Fisher-Yates shuffle en JavaScript
function shuffleLines(text) {
  const lines = text.split('\n');
  // Fisher-Yates: recorre de atrás hacia adelante
  for (let i = lines.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [lines[i], lines[j]] = [lines[j], lines[i]];
  }
  return lines.join('\n');
}
Versión criptográficamente segura
function shuffleSeguro(text) {
  const lines = text.split('\n');
  const arr = new Uint32Array(lines.length);
  crypto.getRandomValues(arr);
  return lines
    .map((line, i) => ({ line, rand: arr[i] }))
    .sort((a, b) => a.rand - b.rand)
    .map(item => item.line)
    .join('\n');
}

Uso

alfa
beta
gamma → ordem aleatória a cada embaralhada

Preguntas frecuentes

¿Para qué sirve esta herramienta?

Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.

¿Se envían mis datos a algún servidor?

El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.

¿Puedo usarlo con datos reales en producción?

Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.