我试图打印一个随机n
字母单词,我n
从命令行本身输入,但由于某种原因,我的脚本每次使用相同的值时都会给我相同的答案n
。
#!/bin/bash
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Run Code Online (Sandbox Code Playgroud)
我将我的脚本称为:
$ bash var3.sh 5
étude # always the same output when using 5
$ bash var3.sh 3
zoo # always the same output when using 3
Run Code Online (Sandbox Code Playgroud)
哪里var3.sh
是我的脚本名称,5 是我想随机打印的单词的长度。
我如何让它打印一个真正随机的单词?
小智 20
它没有。但是 $RANDOM 返回大数字(0 到 32767 之间),特别是对于长度有限的单词,它显示相同的结果,因为该head
部分可能返回 grep 的所有结果(对于 3, my 中只有 819 个匹配项/usr/share/dict/words
)。
更好的解决方案可能是对结果进行洗牌:
egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1
where-R
表示--random-sort
(GNUsort
扩展)。
Fox*_*Fox 19
打印任意num字母单词的简单方法使用shuf
:
egrep "^.{$num}$" /usr/share/dict | shuf -n1
Run Code Online (Sandbox Code Playgroud)
该shuf
命令输出输入的随机排列,-n1
标志告诉它只输出这个结果的第一项。
正如其他人指出的那样,您的代码的主要问题是,$RANDOM
它的值通常比特定长度的单词数大得多。
awk
仅使用:
$ awk -v len="$num" 'length == len { word[i++]=$0 }
END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac
Run Code Online (Sandbox Code Playgroud)
程序从给定文件中读取所有具有特定长度的行。这些存储在数组中words
。
最后,从该数组中选择并打印一个随机元素。