Como definir uma variável para um valor aleatório com bash

14

Em um programa, preciso definir uma variável para um valor aleatório de 0 ou 1.

Eu não consigo descobrir como fazer isso e o Google falhou comigo.

    
por ChristianF97 19.01.2017 / 11:57

4 respostas

30

Um método fácil é usar $RANDOM para recuperar um número inteiro pseudoaleatório de 16 bits no intervalo [0; 32767]. Você pode simplesmente converter isso para [0; 1] calculando o módulo 2 do número aleatório:

echo $(( $RANDOM % 2 ))

Mais informações sobre o $RANDOM de Bash: link

Com essa construção simples, você pode criar facilmente scripts poderosos usando aleatoriedade, como nesta história em quadrinhos ...

    
por Byte Commander 19.01.2017 / 12:06
13

Você pode usar 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

Exemplo:

$ 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
    
por Zanna 19.01.2017 / 12:11
5

Que tal:

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

Ou até mesmo:

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

Ou talvez:

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

Ou mais rapidamente:

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

E também:

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

Além de:

r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))
    
por Colin Ian King 19.01.2017 / 12:06
1

Este script não tem benefícios sobre as respostas existentes. Apenas para fins de entretenimento ...

Obtenha um byte de /dev/urandom (embora, em geral, o envio de caracteres binários arbitrários para o console não seja recomendado, pois pode gerar resultados inesperados / confusos):

head -c 1 /dev/urandom

E volte para o número decimal:

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

E obtenha o restante de sua divisão por 2:

echo $(('head -c 1 /dev/urandom | od -An -t u1' % 2))
    
por Sasha 19.01.2017 / 23:11