2010-03-05 21 views
24

Estoy creando un bot en Shell Guión:Seleccione un elemento de azar de un conjunto

# Array with expressions 
expressions=("Ploink Poink" "I Need Oil" "Some Bytes are Missing!" "Poink Poink" "Piiiip Beeeep!!" "Hello" "Whoops! I'm out of memmory!") 

# Seed random generator 
RANDOM=$$$(date +%s) 

# Loop loop loop loop loop loop ... 
while [ 1 ] 
do 
    # Get random expression... 
    selectedexpression=${expressions[$RANDOM % ${#RANDOM[*]}]} 

    # Write to Shell 
    echo $selectedexpression 


    # Wait an half hour 
    sleep 1 # It's one second for debugging, dear SOers 
done 

Quiero que imprime un artículo al azar de la expressions cada segundo. Intenté esto pero no funciona. Solo imprime el primero (Ploink Poink) todo el tiempo. ¿Puede alguien ayudarme? Gracias

Respuesta

54

cambiar la línea donde se define selectedexpression a

selectedexpression=${expressions[$RANDOM % ${#expressions[@]} ]}

Quiere que su índice en la expresión de ser un número aleatorio entre 0 y la longitud de la matriz de expresión. Esto hará eso.

+6

Tenga en cuenta que el código todavía se corregirá hacia los índices de matriz inferiores . – Joey

+10

Es cierto. Sin embargo, a menos que su lista de expresiones sea muy larga, el efecto es menor. $ RANDOM es un número entre 0 y 32767. Supongamos que tiene 100 elementos en su lista. Los primeros 67 elementos tendrían una probabilidad de 328/32767 (.01001), mientras que los últimos 33 tendrían una probabilidad de 327/32767 (.00998). Para una lista más corta, la diferencia sería aún menor. Aún así, tiene un buen punto, y la función RANDOM de shell no es adecuada para situaciones en las que debe tener números verdaderamente aleatorios, como la criptografía. –

3

Aquí es otra solución que puede ser un poco más al azar que la solución de Jacob Mattison (difícil decir a partir de los jot páginas de manual):

declare -a expressions=('Ploink' 'I Need Oil' 'Some Bytes are Missing' 'Poink Poink' 'Piiiip Beeeep' 'Hello' 'Whoops I am out of memory') 
index=$(jot -r 1 0 $((${#expressions[@]} - 1))) 
selected_expression=${expressions[index]} 
+1

Funcionó muy bien para una breve lista elegida al azar. ¡Gracias! – Terrance

4
arr[0]="Ploink Poink" 
arr[1]="I Need Oil" 
arr[2]="Some Bytes are Missing!" 
arr[3]="Poink Poink" 
arr[4]="Piiiip Beeeep!!" 
arr[5]="Hello" 
arr[6]="Whoops! I'm out of memmory!" 
rand=$[$RANDOM % ${#arr[@]}] 
echo $(date) 
echo ${arr[$rand]} 
+0

esto da - 'lun mar 13 10:04:55 IST 2017 ¡Vaya! Me quedé sin memmory! ' –

+0

Se pueden agregar elementos adicionales a la matriz, p. 'arr [7] =" Zip, ding, otra línea ". – noobninja

Cuestiones relacionadas