Necesito un script de línea de comando que genere un número entero aleatorio entre 1 y 6. Estoy usando Ubuntu con bash.
Estuve trabajando en esto hace un par de meses usando 'bc', pero nunca logré que funcionara por completo. Desde entonces he olvidado adónde llegué.
Estoy usando esto para cambiar un script crontab para que no siempre se ejecute cada 15 minutos, sino en momentos aleatorios (15+-3 minutos). es decir. cambie el crontab para que sea cada 12 minutos, y luego en el script duerma durante 1 a 6 minutos antes de ejecutar el script (que es básicamente un wget para verificar el estado de una página web).
Respuesta1
Ver hombre bash,PARÁMETROSsección,Variables del shellsubsección:
RANDOM Each time this parameter is referenced, a random integer between 0 and 32767 is generated. The sequence of random numbers may be initialized by assigning a value to RANDOM. If RANDOM is unset, it loses its special properties, even if it is subsequently reset.
Para restringir el valor al intervalo 1..6 utilice la $((RANDOM%6+1))
expresión. 1
O puedes usar /dev/urandom
lo siguiente:
tr -dc '1-6' < /dev/urandom | head -c 1
Respuesta2
Puedo proponer un generador aleatorio congruencial lineal personalizado o X(n+1) = (343*X(n) ) % M17 donde, M17= 2^17 - 1 = 131071 es el número primo de Mersenne (p=17). La secuencia pseudoaleatoria se distribuye uniformemente con un rango [0,131070], luego puede limitar el rango a [1,6[ de la siguiente manera: Z6 = 6*X(n)/M17 + 1
Código de muestra:
#!/bin/bash
M=6 #change this if you need different ranges
let "z=(343*10#`date +%N`)%131071"
let "z=$M*z/131071+1"
echo $z
Este es un generador aleatorio de una sola vez. Si necesita una secuencia aleatoria, entonces la semilla 10#date +%N
se usará solo una vez para comenzar y el generador se usará en un bucle. Probado en Ubuntu 12.04 LTS. ¡Divertirse!