Variable elegida al azar entre tres números (10, 100 y 1000)

19

¿Es posible tener una variable que elija un número aleatorio de tres números predeterminados?

Muestra:

var= 10 or 100 or 1000
Espen Larsen
fuente
1
No programo en UNIX, por lo que no puedo escribir el código, pero aquí hay otro enfoque: val = left ("1000", length = Random 2 a 4). Para tener tres valores no relacionados, el código sería similar.
Sensii Miller

Respuestas:

31

Use una matriz para contener los valores y elija entre ellos usando la variable incorporada $RANDOM. Por ejemplo,

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 calidad de la aleatoriedad no será la mejor posible (lea los bytes /dev/urandompara eso), pero debería ser más que suficiente para un script.

Nota 1: Como ya se ha observado en los comentarios, en lugar de inicializar los elementos de la matriz de forma individual una lata de utilizar un curso Litteral matriz: x=(10 100 1000).

Nota 2: en lugar de codificar el número de elementos en la matriz, se puede extraer un elemento Radom ${x[$RANDOM%${#x[@]}]}.

AlexP
fuente
55
+1 Si bien la respuesta de zeppelin es inteligente en este caso particular, el enfoque de matriz es mucho más general.
Kamil Maciorowski
44
Parece que x=(10 100 1000)crea una matriz de un literal en bash, esto sería más legible y más idiomático
gato
1
@cat: La opinión sobre la legibilidad varía. Me gusta poner elementos individuales en líneas separadas, generalmente con comentarios finales que explican el valor.
AlexP
@AlexP Oh, supongo que no comentaría si pensara que fue a propósito. bastante justo
gato
1
@AlexP 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.algo así?
Nick T
30

Si está utilizando bash (o zsh o ksh93 ) puede hacer lo siguiente:

echo "$((10**($RANDOM%3+1)))"

o

var=$((10**($RANDOM%3+1)))

para asignarlo a var

zepelín
fuente
:). Fácil cuando lo ves, pero no lo hice. ¡¡Gracias!!
Espen Larsen
20

También puede usar la shufutilidad GNU coreutils :

a=$(shuf -n1 -e 10 100 1000)

Sin RANDOMembargo, usar según las otras respuestas es casi seguro.

Trauma digital
fuente
Esta es la mejor respuesta.
Tulains Córdova
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
fuente
5

Aquí hay una forma ligeramente críptica:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0

Esto asignará el valor aleatorio a $varlo requerido. La printfcadena de formato es 1%0Nd: esto hace 0que se imprima con Nceros a la izquierda, donde Nhabrá un número entero aleatorio en el intervalo [1,3].

Trauma digital
fuente