Генерация случайных чисел скриптом оболочки

#bash #shell #variables #random #random-sample

#bash #оболочка #переменные #Случайный

Вопрос:

var=$RANDOM создает случайные числа, но как я могу указать диапазон, например, от 0 до 12?

Ответ №1:

Если у вас уже есть свой случайный номер, вы можете сказать

 var=$RANDOM
var=$[ $var % 13 ]
  

чтобы получить числа из 0..12 .

Редактировать: Если вы хотите создавать числа от $x до $y , вы можете легко изменить это:

 var=$[ $x   $var % ($y   1 - $x) ]
  

Ответ №2:

От 0 до 12 (включено):

 echo $((RANDOM % 13))
  

Редактировать: Обратите внимание, что этот метод не является строго правильным. Поскольку 32768 не кратно 13, вероятность того, что будут сгенерированы числа от 0 до 8, немного выше (0,04%), чем у остальных чисел (от 9 до 12).

Вот функция оболочки, которая должна выдавать сбалансированный вывод:

 randomNumber()
{
  top=32768-$((32768%($1 1)))
  while true; do
    r=$RANDOM
    [ r -lt $top ] amp;amp; break
  done
  echo $((r%$1))
}
  

Конечно, следует разработать что-то лучшее, если большее значение диапазона превышает 32767.

Ответ №3:

Альтернатива с использованием shuf, доступная в Linux (или, если быть точным, coreutils):

 var=$(shuf -i0-12 -n1)
  

Комментарии:

1. Meh. Тогда ваш скрипт не переносим.

Ответ №4:

Вот так

 echo $(( $RANDOM % 12 ))
  

Я надеюсь, что это поможет.

Комментарии:

1. Исправление: $ (( $RANDOM % 13 ))

2. да, согласен, спасибо. Я был так взволнован, что сначала смог ответить на простой вопрос, я недостаточно тщательно тестировал! Спасибо за 2 голоса «за» (кто бы вы ни были) 😉

3. Обратите внимание, что внутренний $ необязателен, поскольку найденные там нечисловые строки могут быть только именами переменных.

Ответ №5:

В этом документе есть несколько примеров использования подобного ДИАПАЗОНА и нижнего уровня, которые могут быть полезны: http://tldp.org/LDP/abs/html/randomvar.html

Ответ №6:

Во FreeBSD и, возможно, других BSD вы можете использовать:

 jot -r 3 0 12
  

Это создаст 3 случайные числа от 0 до 12 включительно.

Другой вариант, если вам нужно только одно случайное число для каждого скрипта, вы можете сделать:

 var=$(( $$ % 13 ))
  

В качестве начального значения будет использоваться PID скрипта, который должен быть в основном случайным. Диапазон снова будет от 0 до 12.

Комментарии:

1. В Mac OS X тоже есть jot. Но не Linux, так что это не переносимо.