Sí. De hecho, la mayoría de estos mecanismos rotos se barajan porque están usando algoritmos de barajado "secretos".
En términos generales, un mecanismo de barajado tiene dos componentes:
- algoritmo de barajado.
-
generador de números pseudoaleatorios (PRNG) .
Si bien el algoritmo de barajado puede tener un cierto sesgo propio, todo el mecanismo de barajado no puede tener un sesgo menor al del PRNG. En otras palabras, un algoritmo de barajado no puede ser más aleatorio que su PRNG. Veamos uno de los algoritmos de barajado más eficientes que existen, el shuffle de Fisher – Yates .
El código fuente (o, más bien, el pseudocode ) de la mezcla aleatoria moderna de Fisher-Yates ha estado disponible públicamente desde 1964, con implementaciones en decenas de idiomas.
To shuffle an array a of n elements (indices 0..n-1):
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
Sin embargo, sigue siendo uno de los algoritmos más utilizados para este propósito.
Si te fijas bien, el algoritmo depende de random integer
. Aquí es donde el PRNG entra en juego. Si su PRNG es imparcial y su implementación es correcta, entonces sus aleatorias también deben ser imparciales.
Hay disponibles muchos PRNG buenos que están bien examinados, probados en el tiempo y que han demostrado ser imparciales. Dado que un PRNG es determinista (para el mismo estado inicial, siempre devuelve el mismo valor), la seguridad / aleatoriedad de todo el mecanismo de mezcla aleatoria depende de la aleatoriedad del estado inicial del PRNG, su seed . Esta confianza en la calidad de la semilla es una extensión del Kerckhoffs 'Principle , ya que sin conocer el conocimiento de la semilla de El algoritmo no te dice nada. Afortunadamente, la mayoría de los PRNG buenos utilizan buenas "fuentes de aleatoriedad" proporcionadas por el sistema operativo, como /dev/urandom
.