Возможно ли иметь переменную, которая выбирает случайное число из трех заранее определенных чисел?
Образец:
var= 10 or 100 or 1000
Возможно ли иметь переменную, которая выбирает случайное число из трех заранее определенных чисел?
Образец:
var= 10 or 100 or 1000
Ответы:
Используйте массив для хранения значений и выбирайте среди них встроенную переменную $RANDOM
. Например,
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
Качество случайности не будет наилучшим (читайте байты /dev/urandom
для этого), но оно должно быть более чем достаточно для сценария.
Примечание 1: Как люди наблюдали в комментариях, вместо того , чтобы инициализировать элементы массива по отдельности , конечно , можно использовать litteral массива: x=(10 100 1000)
.
Примечание 2: Вместо жесткого кодирования количества элементов в массиве, элемент radom может быть извлечен с помощью ${x[$RANDOM%${#x[@]}]}
.
x=(10 100 1000)
создает массив из литерала в bash, это было бы более читабельным и более идиоматическим
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.
что-то подобное?
Если вы используете bash (или zsh или ksh93 ), вы можете просто сделать:
echo "$((10**($RANDOM%3+1)))"
или
var=$((10**($RANDOM%3+1)))
назначить его в var
Вы также можете использовать shuf
утилиту GNU coreutils :
a=$(shuf -n1 -e 10 100 1000)
Использование RANDOM
в соответствии с другими ответами почти наверняка быстрее, хотя.
Вот немного загадочный способ:
printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
Это назначит случайное значение $var
как требуется. printf
Форматная строка 1%0Nd
- это приводит 0
к печататься с N
ведущими нулями, где N
будет случайным целым числом в интервале [1,3]
.