11.04.2013 Views

Guida avanzata di scripting Bash - Portale Posta DMI

Guida avanzata di scripting Bash - Portale Posta DMI

Guida avanzata di scripting Bash - Portale Posta DMI

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

}<br />

fi<br />

else<br />

max=$((max/<strong>di</strong>visibilePer*<strong>di</strong>visibilePer))<br />

fi<br />

Capitolo 9. Variabili riviste<br />

# -----------------------------------------------------------------------<br />

# Ora il lavoro vero.<br />

# E’ da notare che per ottenere una corretta <strong>di</strong>stribuzione dei valori<br />

#+ estremi, si deve agire su un intervallo che va da 0 a<br />

#+ abs(max-min)+<strong>di</strong>visibilePer, non semplicemente abs(max-min)+1.<br />

# Il leggero incremento produrrà la giusta <strong>di</strong>stribuzione per i<br />

#+ valori limite.<br />

# Se si cambia la formula e si usa abs(max-min)+1 si otterranno ancora<br />

#+ dei risultati corretti, ma la loro casualità sarà falsata<br />

#+ dal fatto che il numero <strong>di</strong> volte in cui verranno restituiti gli estremi<br />

#+ ($min e $max) sarà considerevolmente inferiore a quella ottenuta<br />

#+ usando la formula corretta.<br />

# -----------------------------------------------------------------------<br />

intervallo=$((max-min))<br />

[ ${intervallo} -lt 0 ] && intervallo=$((0-intervallo))<br />

let intervallo+=<strong>di</strong>visibilePer<br />

interCasualeNum=$(((RANDOM%intervallo)/<strong>di</strong>visibilePer*<strong>di</strong>visibilePer+min))<br />

return 0<br />

# Tuttavia, Paulo Marcel Coelho Aragao sottolinea che<br />

#+ quando $max e $min non sono <strong>di</strong>visibili per $<strong>di</strong>visibilePer,<br />

#+ la formula sbaglia.<br />

#<br />

# Suggerisce invece la seguente:<br />

# numeroc = $(((RANDOM%(max-min+1)+min)/<strong>di</strong>visibilePer*<strong>di</strong>visibilePer))<br />

# Verifichiamo la funzione.<br />

min=-14<br />

max=20<br />

<strong>di</strong>visibilePer=3<br />

# Genera un array e controlla che si sia ottenuto almeno uno dei risultati<br />

#+ possibili, se si effettua un numero sufficiente <strong>di</strong> tentativi.<br />

declare -a risultati<br />

minimo=${min}<br />

massimo=${max}<br />

if [ $((minimo/<strong>di</strong>visibilePer*<strong>di</strong>visibilePer)) -ne ${minimo} ]; then<br />

if [ ${minimo} -lt 0 ]; then<br />

minimo=$((minimo/<strong>di</strong>visibilePer*<strong>di</strong>visibilePer))<br />

151

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!