2016-10-14 4 views
0

Мне нужно написать программу, которая показывает некоторые слова на изображении, которое случайно повернуто. Я бы хотел, чтобы они находились между, например, от -30 до 30 °. Но я не нашел никакой команды в bash/UNIX, которая могла бы генерировать случайное число между положительным и отрицательным.Bash Создайте случайное число между положительным и отрицательным

Благодарим за помощь.

+3

'$ RANDOM 'вернет случайное положительное число. Используйте '% 61', чтобы получить его в диапазоне от 0 до 60, а затем вычесть 30. – Barmar

+0

Это просто простая арифметика. Если вы закончили среднюю школу, это должно быть очевидно. – Barmar

ответ

1

Правильный подход (никаких внешних процессов не генерируется) уже был представлен @Barmar в комментарии.

Если ОП необходимо это разгадали, вот оно:

angle=$(($RANDOM%61-30)) 

, но я хотел бы предложить худший вариант, так как кто-то сказал, что «хуже, тем лучше»

angle=$(seq -30 30 | shuf -n 1) 
  • seq помещает в stdout последовательность целых чисел, символ новой строки,
  • shuf случайным образом перетасовывает свой вход,
    • опция -n 1 означает выход только первый перемешиваются случайным образом линии,

так, что мы имеем, что мы генерируем колоду карт, пронумерованных -30 ... +30, мы перетасовать колоду и мы имеем дело только с первой картой.

В моем ответе то, что мне нравится, заключается в том, что диапазон решения сформулирован более четко, по крайней мере, из POV не математически наделенного человека.

наоборот это медленнее, чем использование $RANDOM

10:31 [email protected]:~ $ time for i in {1..10000} ; do echo > /dev/null ; done 

real 0m0.077s 
user 0m0.036s 
sys  0m0.040s 
10:32 [email protected]:~ $ time for i in {1..10000} ; do echo $(($RANDOM%61-30)) > /dev/null ; done 

real 0m0.138s 
user 0m0.116s 
sys  0m0.020s 
10:32 [email protected]:~ $ time for i in {1..10000} ; do echo $(seq -30 30|shuf -n 1) > /dev/null ; done 

real 0m33.328s 
user 0m0.372s 
sys  0m4.560s 
10:33 [email protected]:~ $ 

(с другой стороны, она занимает всего 3,3 мс, если вы используете его РАЗ в сценарии ... :-)

+0

Другой вариант - генерировать ваш список один раз как массив, 'angles = ($ (seq -30 30))', тогда вы можете рисовать без замены столько раз, сколько хотите с помощью '$ {angles [$ (($ RANDOM% $ {# углы [*]}))]} '. Для меня время было примерно столько же, сколько для ваших первых двух примеров, добавленных вместе: я получил 0.039s, 0.065s, 13.395s «реальные» времена для ваших, и 0.098s для моего. –

+0

Что мы оба делаем, это выборка [с заменой] (https://www.ma.utexas.edu/users/parker/sampling/repl.htm); – gboffi

+0

Er, да - я должен проверить, что я набираю совпадения, что я думаю! Я действительно хотел сказать * «с заменой» *! –

0

Вот отрывок, который дает случайные целые числа от -30 до 30:

while true ; do echo $((RANDOM % 61 - 30)) ; done 

В более общем плане, чтобы получить случайные целые числа в диапазоне [a..b], попробуйте:

read a b 
while true ; do echo $((RANDOM % (b-a+1) + a)) ; done 
Смежные вопросы