我的脚本在使用 $RANDOM 时产生相同的输出

我的脚本在使用 $RANDOM 时产生相同的输出

我正在尝试打印一个随机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

最后,从该数组中选择一个随机元素并打印。

相关内容