Как установить переменную в случайное значение с помощью bash

14

В программе мне нужно установить переменную на случайное значение 0 или 1.

Я не могу понять, как это сделать, и Google подвел меня.

cheesits456
источник

Ответы:

30

Один простой способ - использовать $RANDOMдля получения псевдослучайного 16-битного целого числа в диапазоне [0; 32767]. Вы можете просто преобразовать это в [0; 1] путем вычисления по модулю 2 случайного числа:

echo $(( $RANDOM % 2 ))

Более подробная информация о Bash $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

С помощью этой простой конструкции вы можете легко создавать мощные сценарии, используя случайность, как в этом комиксе ...

Commit Strip - Русская рулетка

Byte Commander
источник
4
Педанец во мне чувствует необходимость указать, что выбранная команда по уничтожению --no-preserve-rootрабочего сервера ничего не сделает без этого - так что, может быть, не та игра в русскую рулетку, на которую они надеялись ...
Борис Паук
2
@BoristheSpider они используют устаревший $[]синтаксис - кто знает, была ли у rmних эта --no-preserve-rootфункция?
Муру
10
@BoristheSpider Моя интерпретация комикса заключается в том, что, когда они видят сообщение rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe, они низко опускают голову и, зная, что проиграли игру, приступают к удалению диска с ddчестью.
Элия ​​Каган
@EliahKagan ах, сеппуку. Понял.
Борис Паук
@BoristheSpider: --no-preserve-rootреализовано только "в последнее время". У меня нет информации о том, когда он был реализован, но IIRC ему всего несколько лет. И это очень мало, когда дело доходит до Linux. Вот билет по этому поводу: bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache
13

Вы могли бы использовать shuf

DESCRIPTION
     Write a random permutation of the input lines to standard output.

     -i, --input-range=LO-HI
            treat each number LO through HI as an input line
     -n, --head-count=COUNT
            output at most COUNT lines

Пример:

$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
0
$ foo=$(shuf -i0-1 -n1)
$ echo $foo
1
Занна
источник
5

Как насчет:

#!/bin/bash
r=$(($RANDOM % 2))
echo $r

Или даже:

r=$(($(od -An -N1 -i /dev/random) % 2))

Или возможно:

r=$(seq 0 1 | sort -R  | head -n 1)

Или более счастливым

r=$(($(head -128 /dev/urandom | cksum | cut -c1-10) % 2))

А также:

r=$(apg -a 1 -M n -n 1 -m 8 -E 23456789  | cut -c1)

Также как и:

r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))
Колин Ян Кинг
источник
1

Этот скрипт не имеет преимуществ перед существующими ответами. Просто для развлекательных целей ...

Получить один байт от /dev/urandom(хотя отправка произвольных двоичных символов в консоль не рекомендуется ™, поскольку это может привести к неожиданным / запутанным результатам):

head -c 1 /dev/urandom

И превратить в десятичное число:

head -c 1 /dev/urandom | od -An -t u1

И получим остаток от его деления на 2:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
Саша
источник