Dans un programme, je dois définir une variable sur une valeur aléatoire de 0 ou 1.
Je ne sais pas comment le faire et Google m'a échoué.
Dans un programme, je dois définir une variable sur une valeur aléatoire de 0 ou 1.
Je ne sais pas comment le faire et Google m'a échoué.
Réponses:
Une méthode simple consiste $RANDOM
à récupérer un nombre entier pseudo-aléatoire de 16 bits dans la plage [0; 32767]. Vous pouvez simplement convertir cela en [0; 1] en calculant le modulo 2 du nombre aléatoire:
echo $(( $RANDOM % 2 ))
Plus d'informations sur Bash $RANDOM
: http://www.tldp.org/LDP/abs/html/randomvar.html
Avec cette construction simple, vous pouvez facilement créer des scripts puissants en utilisant l'aléatoire, comme dans cette bande dessinée ...
$[]
syntaxe désuète - qui sait si ils rm
avaient cette --no-preserve-root
fonctionnalité?
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
, ils penchent la tête basse et, sachant qu'ils ont perdu le jeu, procèdent à l'effacement de leur disque avec dd
, par honneur.
--no-preserve-root
n'a été implémenté que "récemment". Je n'ai aucune information sur la date de sa mise en œuvre, mais l'IIRC ne date que de quelques années. Et c'est une infime quantité quand il s'agit de Linux. Voici un billet à ce sujet: bugs.launchpad.net/ubuntu/+source/coreutils/+bug/174283
Vous pourriez utiliser 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
Exemple:
$ 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
Que diriez-vous:
#!/bin/bash
r=$(($RANDOM % 2))
echo $r
Ou même:
r=$(($(od -An -N1 -i /dev/random) % 2))
Ou peut-être:
r=$(seq 0 1 | sort -R | head -n 1)
Ou plus malicieusement:
r=$(($(head -128 /dev/urandom | cksum | cut -c1-10) % 2))
Et aussi:
r=$(apg -a 1 -M n -n 1 -m 8 -E 23456789 | cut -c1)
Aussi bien que:
r=$((0x$(cut -c1-1 /proc/sys/kernel/random/uuid) % 2))
Ce script n'a aucun avantage sur les réponses existantes. Juste à des fins de divertissement ...
Obtenez un octet de /dev/urandom
(bien qu'en général, l'envoi de caractères binaires arbitraires à la console n'est pas recommandé ™ car cela peut donner des résultats inattendus / déroutants):
head -c 1 /dev/urandom
Et transformez-le en nombre décimal:
head -c 1 /dev/urandom | od -An -t u1
Et obtenez le reste de sa division par 2:
echo $((`head -c 1 /dev/urandom | od -An -t u1` % 2))
--no-preserve-root
- donc peut-être pas le jeu de roulette russe qu'ils espéraient ...