Comment définir une variable sur une valeur aléatoire avec bash

14

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é.

cheesits456
la source

Réponses:

30

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 ...

Commit Strip - Roulette russe

Byte Commander
la source
4
Le pédant en moi ressent le besoin de souligner que la commande de destruction du serveur de production choisie ne fera rien sans --no-preserve-root- donc peut-être pas le jeu de roulette russe qu'ils espéraient ...
Boris the Spider
2
@BoristheSpider, ils utilisent la $[]syntaxe désuète - qui sait si ils rmavaient cette --no-preserve-rootfonctionnalité?
muru
10
@BoristheSpider Mon interprétation de la bande dessinée est que, quand ils voient le message 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.
Eliah Kagan
@EliahKagan ah, seppuku. Compris.
Boris the Spider le
@BoristheSpider: Le --no-preserve-rootn'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
Apache
13

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
Zanna
la source
5

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))
Colin Ian King
la source
1

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))
Sasha
la source