Come impostare una variabile su un valore casuale con bash


14

In un programma, devo impostare una variabile su un valore casuale di 0 o 1.

Non riesco a capire come farlo e Google mi ha deluso.

Risposte:


30

Un metodo semplice è utilizzare $RANDOMper recuperare un numero intero pseudocasuale di 16 bit nell'intervallo [0; 32767]. Puoi semplicemente convertirlo in [0; 1] calcolando il modulo 2 del numero casuale:

echo $(( $RANDOM % 2 ))

Ulteriori informazioni su Bash $RANDOM: http://www.tldp.org/LDP/abs/html/randomvar.html

Con quel semplice costrutto puoi facilmente creare script potenti usando la casualità, come in questo fumetto ...

Commit Strip - Russian Roulette


4
Il pedante in me sente il bisogno di sottolineare che il comando di distruzione del server di produzione prescelto non farà nulla senza --no-preserve-root- quindi forse non è il gioco della roulette russa che speravano ...
Boris the Spider

2
@BoristheSpider stanno usando la $[]sintassi antiquata - chissà se rmavevano quella --no-preserve-rootcaratteristica?
Muru,

10
@BoristheSpider La mia interpretazione del fumetto è che, quando vedono il messaggio rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe, abbassano la testa e, sapendo di aver perso il gioco, continuano a cancellare il loro disco dd, per onore.
Eliah Kagan,

@EliahKagan ah, seppuku. Inteso.
Boris the Spider

@BoristheSpider: è --no-preserve-rootstato implementato solo "ultimamente". Non ho informazioni su quando è stato implementato, ma IIRC ha solo pochi anni. E questa è una piccola quantità quando si tratta di Linux. Ecco un biglietto su questo: bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Apache

13

Puoi usare 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

Esempio:

$ 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

Che ne dite di:

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

O anche:

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

O forse:

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

O più con troppa astuzia:

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

E anche:

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

Così come:

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

1

Questo script non ha vantaggi rispetto alle risposte esistenti. Solo per scopi di intrattenimento ...

Ottieni un byte da /dev/urandom(anche se in generale non è consigliabile inviare caratteri binari arbitrari alla console ™ perché potrebbe dare risultati imprevisti / confusi):

head -c 1 /dev/urandom

E trasformalo in numero decimale:

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

E ottieni il resto della sua divisione per 2:

echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.