J'essaie d'imprimer un n
mot de lettre aléatoire , où j'entre à n
partir de la ligne de commande elle-même, mais pour une raison quelconque, mon script me donne la même réponse à chaque fois lorsque j'utilise la même valeur pour n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
J'appelle mon script comme:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
où var3.sh
est le nom de mon script et 5 est la longueur du mot que je veux imprimer au hasard.
Comment puis-je faire imprimer un mot vraiment aléatoire?
$RANDOM
est très probablement supérieur au nombre de mots à n lettres pour la plupart des valeurs de n (95,7% du temps pour n = 3 pour moi).shuf
ousort -R
comme suggéré dans les réponses. Vous pouvez également utiliser$RANDOM
, mais d'une manière plus avancée. Tous ces outils produisent des résultats prévisibles (ils ne sont pas vraiment aléatoires), mais ils sont rapides et suffisamment bons pour de nombreuses applications.Réponses:
Ce n'est pas le cas. Mais $ RANDOM renvoie de grands nombres (entre 0 et 32767) qui, en particulier pour les mots de longueur limitée, montrent le même résultat, car la
head
partie renvoie probablement tous les résultats du grep (pour 3, il n'y a que 819 correspondances dans mon/usr/share/dict/words
).La meilleure solution pourrait être de mélanger les résultats:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
où
-R
signifie--random-sort
(unesort
extension GNU ).la source
tail
? Cela avait du sens dans le script OP, mais puisque vous mélangez, vous pouvez également utiliserhead
, etsort
devrait ensuite être en mesure de détecter le tuyau cassé et de ne pas déranger le reste des lignes.shuf -n1
, qui est une pipe de moins ...Une méthode simple pour imprimer un arbitraire num -lettre mot utilisations
shuf
:La
shuf
commande génère une permutation aléatoire de l'entrée et le-n1
drapeau lui indique de ne sortir que le premier élément de ce résultat.la source
grep -Ex ".{$num}"
. Ouawk 'length == n' n="$num"'
.Comme d'autres l'ont souligné, le principal problème avec votre code est que le
$RANDOM
plus souvent, il va y avoir une valeur beaucoup plus grande que le nombre de mots d'une certaine longueur.En utilisant
awk
uniquement:Le programme lit dans toutes les lignes du fichier donné qui sont d'une certaine longueur. Ceux-ci sont stockés dans le tableau
words
.À la fin, un élément aléatoire de ce tableau est sélectionné et imprimé.
la source