我正在尝试打印一个随机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 是我要随机打印的单词的长度。
我如何让它打印一个真正随机的单词?
答案1
事实并非如此。但是 $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
(GNUsort
扩展)。
答案2
打印任意内容的简单方法编号-字母词用途shuf
:
egrep "^.{$num}$" /usr/share/dict | shuf -n1
该shuf
命令输出输入的随机排列,并且该-n1
标志告诉它仅输出该结果中的第一项。
答案3
正如其他人指出的那样,代码的主要问题是,$RANDOM
通常情况下,值远大于特定长度的单词数。
仅使用awk
:
$ awk -v len="$num" 'length == len { word[i++]=$0 }
END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac
该程序从给定文件中读取特定长度的所有行。这些都存储在数组中words
。
最后,从该数组中选择一个随机元素并打印。