È possibile avere una variabile che seleziona un numero casuale da tre numeri prestabiliti?
Campione:
var= 10 or 100 or 1000
È possibile avere una variabile che seleziona un numero casuale da tre numeri prestabiliti?
Campione:
var= 10 or 100 or 1000
Risposte:
Utilizzare un array per contenere i valori e scegliere tra loro utilizzando la variabile incorporata $RANDOM
. Per esempio,
x[0]=10 # One decade
x[1]=100 # One century
x[2]=1000 # One millennium
for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10
La qualità della casualità non sarà la migliore possibile (leggi i byte /dev/urandom
per quello), ma dovrebbe essere più che sufficiente per uno script.
Nota 1: Come persone hanno osservato nei commenti, invece di inizializzare gli elementi dell'array individualmente uno può naturalmente utilizzare un letterale array: x=(10 100 1000)
.
Nota 2: Invece di codificare il numero di elementi nell'array, è possibile estrarre un elemento radom ${x[$RANDOM%${#x[@]}]}
.
x=(10 100 1000)
creare un array da un letterale in bash, questo sarebbe più leggibile e più idiomatico
x[0]=10 # This sets the first value of x to ten. Ten is the number of fingers that humans have (excepting birth defects or mutilation). It is also the sum of 9 and 1, or product of 5 and 2. Ten is not prime. A traditional Christmas gift is ten lords a-leaping.
qualcosa del genere?
Se stai usando bash (o zsh o ksh93 ) puoi semplicemente fare:
echo "$((10**($RANDOM%3+1)))"
o
var=$((10**($RANDOM%3+1)))
per assegnarlo a var
Puoi anche usare l' shuf
utility GNU coreutils :
a=$(shuf -n1 -e 10 100 1000)
L'uso RANDOM
secondo le altre risposte è quasi certamente più veloce però.
Ecco un modo leggermente enigmatico:
printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
Questo assegnerà il valore casuale a $var
come richiesto. La printf
stringa di formato è 1%0Nd
: ciò causa la 0
stampa con N
zeri iniziali, dove N
sarà un numero intero casuale nell'intervallo [1,3]
.