Як встановити змінну на випадкове значення за допомогою bash


14

У програмі мені потрібно встановити змінну на випадкове значення або 0, або 1.

Я не можу зрозуміти, як це зробити, і Google зірвав мене.

Відповіді:


30

Одним з простих методів є використання $RANDOMдля отримання псевдовипадкового 16-бітного цілого числа в діапазоні [0; 32767]. Ви можете просто перетворити це в [0; 1] шляхом обчислення модуля 2 випадкового числа:

echo $(( $RANDOM % 2 ))

Більше інформації про Bash's $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

За допомогою цієї простої конструкції ви можете легко створити потужні сценарії за допомогою випадковості, як у цьому комічному ...

Стрип-коміт - Російська рулетка


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))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.