
Ejecuté el siguiente comando para generar mil millones de números aleatorios:
time shuf -i 1-1000000000 > "SHUF TEST 1"
Para mi sorpresa, pudo hacerlo en menos de 10 minutos. Luego ejecuté el archivo de salida uniq -d
para determinar cuántos de los números generados estaban duplicados y nuevamente me sorprendí cuando resultó ser 0. También ejecuté el archivo de salida uniq -u
para sort -u
confirmar estos resultados.
¿Cómo es posible que el shuf
comando pueda generar mil millones de números aleatorios en un período de tiempo tan relativamente corto? ¿Puedo depender de su aleatoriedad? Tenga en cuenta que no necesito un generador de números aleatorios criptográficamente seguro para mis necesidades, solo algo lo suficientemente bueno como para devolver siempre un número único.
Respuesta1
La shuf
utilidad baraja su entrada generando una permutación aleatoria de sus líneas de entrada. Según su página de manual, "Cada permutación de salida es igualmente probable". Una analogía sería barajar una baraja de cartas.
Si las líneas de entrada contienen duplicados, la salida shuf
también contendrá duplicados. ¿Por qué? Porque shuf
realiza una permutación aleatoria de su entrada. Si las líneas de entrada no contienen duplicados, la salida shuf
no contendrá duplicados.
En su ejemplo, shuf -i 1-1000000000
la -i
opción hace shuf
que actúe como si la entrada viniera de un archivo que contiene el rango de enteros decimales sin signo del 1 al 1000000000, un entero sin signo por línea. En otras palabras, shuf
actúa como si tuviera 1000000000 líneas de entrada y cada línea contiene un entero único sin signo. Por lo tanto, no se encontrarán duplicados en la salida.