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.
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:
Un metodo semplice è utilizzare $RANDOM
per 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 ...
$[]
sintassi antiquata - chissà se rm
avevano quella --no-preserve-root
caratteristica?
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.
--no-preserve-root
stato 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
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
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))
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))
--no-preserve-root
- quindi forse non è il gioco della roulette russa che speravano ...