Cómo establecer una variable en un valor aleatorio con bash


14

En un programa, necesito establecer una variable en un valor aleatorio de 0 o 1.

No puedo entender cómo hacerlo y Google me ha fallado.

Respuestas:


30

Un método fácil es usar $RANDOMpara recuperar un número entero pseudoaleatorio de 16 bits en el rango [0; 32767]. Simplemente puede convertir eso a [0; 1] calculando el módulo 2 del número aleatorio:

echo $(( $RANDOM % 2 ))

Más información sobre Bash's $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

Con esa construcción simple, puede crear fácilmente scripts potentes utilizando la aleatoriedad, como en este cómic ...

Commit Strip - Ruleta rusa


44
El pedante en mí siente la necesidad de señalar que el comando de destrucción del servidor de producción elegido no hará nada sin --no-preserve-root, así que tal vez no sea el juego de la ruleta rusa que esperaban ...
Boris the Spider

2
@BoristheSpider están utilizando la $[]sintaxis anticuada , ¿quién sabe si rmtenían esa --no-preserve-rootcaracterística?
muru

10
@BoristheSpider Mi interpretación del cómic es que, cuando ven el mensaje rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe, agachan la cabeza y, sabiendo que han perdido el juego, proceden a borrar su disco dd, por honor.
Eliah Kagan

@EliahKagan ah, seppuku. Entendido.
Boris the Spider

@BoristheSpider: --no-preserve-rootSolo se implementó "últimamente". No tengo información sobre cuándo se implementó, pero IIRC tiene solo unos pocos años. Y eso es una pequeña cantidad cuando se trata de Linux. Aquí hay un boleto sobre esto: bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache

13

Podrías 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

Ejemplo:

$ 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

Qué tal si:

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

O incluso:

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

O quizás:

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

O más hackily:

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

Y también:

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

Tanto como:

r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))

1

Este script no tiene beneficios sobre las respuestas existentes. Solo para fines de entretenimiento ...

Obtenga un byte /dev/urandom(aunque en general no se recomienda el envío de caracteres binarios arbitrarios a la consola ™ porque podría dar resultados inesperados / confusos):

head -c 1 /dev/urandom

Y convertirlo en número decimal:

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

Y obtenga el resto de su división por 2:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.