Я пытаюсь напечатать случайное n
буквенное слово, которое вводится n
из самой командной строки, но по какой-то причине мой сценарий дает мне один и тот же ответ каждый раз, когда используется одно и то же значение для n
.
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Я называю свой сценарий так:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
где var3.sh
- имя моего сценария, а 5 - длина слова, которое я хочу напечатать случайным образом.
Как заставить его напечатать действительно случайное слово?
$RANDOM
скорее всего, будет больше, чем количество n- буквенных слов для большинства значений n (95,7% времени для n = 3 для меня).shuf
илиsort -R
как предложено в ответах. Вы также можете использовать$RANDOM
, но более продвинутым способом. Все эти инструменты дают результаты, которые можно прогнозировать (они не являются действительно случайными), но они быстры и достаточно хороши для многих целей.Ответы:
Это не так. Но $ RANDOM возвращает большие числа (от 0 до 32767), которые, особенно для слов ограниченной длины, показывают тот же результат, так как
head
часть, вероятно, возвращает все результаты grep (для 3, в my только 819 совпадений/usr/share/dict/words
).Лучшим решением может быть перемешать результаты:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
где
-R
означает--random-sort
(sort
расширение GNU ).источник
tail
? Это имело смысл в сценарии OP, но поскольку вы тасуете, вы также можете использоватьhead
, а затемsort
должны быть в состоянии обнаружить сломанную трубу и не беспокоиться о перетасовке остальных строк.shuf -n1
, что на одну трубу меньше ...Простой метод для печати произвольного num- буквенного слова использует
shuf
:Команда
shuf
выводит случайную перестановку входных данных, и-n1
флаг указывает, что из этого результата нужно вывести только первый элемент.источник
grep -Ex ".{$num}"
. Илиawk 'length == n' n="$num"'
.Как уже отмечали другие, основная проблема с вашим кодом заключается в том, что
$RANDOM
чаще всего это значение будет намного больше, чем количество слов определенной длины.Используя
awk
только:Программа читает все строки данного файла определенной длины. Они хранятся в массиве
words
.В конце случайный элемент из этого массива выбирается и печатается.
источник