viernes, 24 de octubre de 2008

Números aleatorios con bash

Hace poco me topé con un "pequeño" problema, lo escribo entre comillas porque al final no resultó tan sencillo como creí, necesitaba usar los números del rango [0-999] y después ordenarlos aleatoriamente, con la restricción de que cada cifra tenga exactamente tres números, es decir, el 0 tenía que ser 000, el 21 021, etc.

¿cómo lo resolví?, si quieres saberlo, continua leyendo porque el motivo de esta entrada no es presumir mi solución, sino saber como lo hubieras hecho tú.

La parte de las tres cifras se resuleve fácilmente con el comando printf, ya que funciona de manera similar al prinft de lenguaje C, la diferencia sólo radica en la sintaxis de la instrucción, puedes probar escribiendo en una línea de comandos lo siguiente:


printf "%0.3d\n" 5

como te puedes dar cuenta el problema está resuelto. Ahora, ¿cómo genero los números del 0 al 999?, fácil, usando el comando seq, para mayor información man seq:

seq 0 999

para obtener los números con 3 dígitos cada uno, en el rango [0-999], la sentencia de control de flujo for es la manera más sencilla (según yo):

for i in $(seq 0 999); do printf "%0.3d\n" $i; done

para ordenarlos pseudo-alatoriamente, usé una tubería y el comando sort (hay algo que bash no pueda hacer), usando la bandera -R que seguramente ya leíste después de teclear man sort:

for i in $(seq 0 999); do printf "%0.3d\n" $i; done | sort -R

y ¿para qué demonios necesitaba hacer eso?, ahhhh ... pues para crear los números de los boletos de una rifa que organiza el capítulo estudiantil al que pertenezco, ahí es donde entra el problema porque esos números los tuve que meter a una tabla en una base de datos MySQL, catorce por registro, se convirtio es un fastidio cuando me quería meter los números a un arreglo; no es tan sencillo ya que no se puede usar "directamente" la instrucción antes escrita, tuve que meter los datos a un archivo, leer del archivo e insertar en el arreglo, espero tener tiempo (y ganas) de publicar eso posteriormente, ya que fué bastante entretenido porque hice una plantilla en OpenOffice y "jalé" los datos de la tabla y los inserté en el documento.


Espero sugerencias y sus posibles soluciones a mi pequeño problema.

6 comentarios:

Memo dijo...

woorales, pinche ñoño, tenía que ser Saúl del 8! Yo hubiera echo cosas más ineficientes como generarlos como cadenas.

Unknown dijo...

solución más sencilla, y usando la web (obviamente) ....

1.- Abres el Calc, en la primer celda pones 0, en la segunda la fórmula que incremente el valor de la celda anterior, luego copias esa formula por las primeras mil celdas, cambias el formato de todas las celdas para que rellene con 3 ceros a la izquierda .... copias al portapepeles :D

2.- entras a http://random.org/lists/ pegas la lista en el textarea que está ahí, le das que te "randomice" tu lista, y listo ....

3.- disfrutalo en tu editor de textos preferidos

Saúl dijo...

oscar:
acabo de probar tu solución y en realidad es muy buena y sencilla, ahora ... ¿cómo generas los números y los insertas en una base de datos de "una patada"?

Unknown dijo...

redefine el paso 3.- regresalo a Calc y combinas correspondencia con el Writer :)

Saúl dijo...

por cierto oscarín ... estuve bucando pero nomas no pude, ¿cómo combinas correspondencia con Calc?, saber eso me hubiera ahorrado mucho tiempo

Unknown dijo...

porque tú lo pediste, será tema en mi siguiente post ;) jajaja