Comment obtenir l'aléatoire en ligne de commande?


11

Comment exécuter au hasard une commande dans la liste de commandes spécifiée? Utile pour choisir au hasard le son de démarrage, le fond d'écran ou l'exécution de commandes.

En général, si j'ai des commandes à exécuter comme suit, alors comment obtenir l'aléatoire:?

#!/bin/bash
<command_1>
<command_2>
<command_3>
.
.
.
<command_n>

Ensuite, je veux exécuter au hasard une seule commande parmi les possibilités ci-dessus lorsque le script est exécuté!

Comment faire ça?



@Parto J'ai déjà ajouté comme réponse avant
Pandya

Je n'essayais pas de répondre, je donnais juste un exemple où il peut être utilisé.
Parto

Réponses:


21

La variable $RANDOM(en fait une fonction bash) renvoie un nombre aléatoire de 0 à 32767 inclus.

Vous voudriez généralement limiter sa portée en la divisant par un certain nombre et en prendre le reste, par exemple.

# output a random number 0 to 3
echo $((RANDOM % 4))

Dans cet exemple simpliste, il sera très légèrement biaisé pour tout diviseur qui ne se divise pas également en 32768 (par exemple, tout ce qui n'est pas une puissance de deux), mais dans votre scénario, je ne pense pas que vous seriez troublé par un léger biais.

Pour choisir un fichier aléatoire, vous devez nommer vos fichiers quelque chose comme:

file0.jpg
file1.jpg
file2.jpg
file3.jpg

Et puis vous pouvez en choisir un au hasard avec

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"

1
Vous voudrez peut-être l'afficher comme votre propre réponse - cela pourrait alors vous faire gagner de la réputation.
thomasrutter

utilisation utile de RANDOM, j'ai accepté!
Pandya

1
Notez que RANDOM% N n'entraîne pas une distribution égale à moins que le nombre de valeurs possibles de RANDOM (32768) soit divisible par N.Pour voir cela, imaginez que la plage de RANDOM était plutôt de 0-4 (5 valeurs possibles), et N est 2: il y a trois façons pour que $ RANDOM% 2 donne 0 (si $ RANDOM donne 0, 2, 4) mais deux façons pour qu'il donne 1 (1, 3). Pour une distribution égale, vous devez trouver le plus grand multiple de N inférieur à 32767 et ignorer toutes les valeurs aléatoires supérieures à cela. Dans l'exemple précédent, cela reviendrait à ignorer 5, ce qui est supérieur à 4.
Doval

@Doval Je l'ai dit dans ma réponse, l'avez-vous vu?
thomasrutter

@neon_overload Mon mauvais, j'ai raté ce morceau.
Doval

7

Selon la réponse @neon_overload (en utilisant RANDOM),
je peux mettre un RANDOMexemple de script comme suit (pour 4 commandes):

#!/bin/bash
random_selection=$((RANDOM % 4))

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac

2

Si vous souhaitez que l'aléa passe par un site externe plutôt que par un site généré par votre ordinateur, vous pouvez utiliser ce script:

curl "http://www.random.org/integers/?num=1&min=$1&max=$2&col=1&base=10&format=plain&rnd=new"

Exécuter en tant que rand (MIN) (MAX) (en supposant que vous enregistrez sous / usr / bin / rand)

Vous devrez peut-être installer curl en premier (sudo apt-get install curl) s'il n'est pas déjà installé.


0

Vous pouvez utiliser la shufcommande de GNU coreutils .

NAME
       shuf - generate random permutations

SYNOPSIS
       shuf [OPTION]... [FILE]
       shuf -e [OPTION]... [ARG]...
       shuf -i LO-HI [OPTION]...

DESCRIPTION
       Write a random permutation of the input lines to standard output

Exemple:

$ shuf -i 1-5
4
1
2
5
3

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Maintenant, pour obtenir une entrée aléatoire, vous pouvez utiliser la -n 1sortie de la première ligne.

Exemple d'impression d'un nombre aléatoire de 1 à 100:

$ shuf -i 1-100 -n 1
37

Si vous avez le filecontenu suivant:

$ cat file
command-1
command-2
command-3
command-4
command-5

Vous pouvez également faire quelque chose comme:

$ shuf file -n 1
command-3
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.