最近需要一些随机的单词,或字符串用于测试。生成随机的字符串的方法有很多种,那如何生成一些随机的单词了?
在Linux系统中自带了一个词典文件,其中存储了大量的单词,借助这个词典文件和随机数可以生成任意的随机单词。Linux中的这个词典文件位于/usr/share/dict/目录下,这些单词每个占一行。现在目标已经很明确了,只要生成任意随机数,然后读取这个单词就可以了。sed可以读取一个文件的指定行,例如 sed -n 10p filename可以读取filename这个文件的第10行。
至于随机数可以使用
RANDON这个变量来获得。但是
RANDON所获得的随机数范围为[0, 32767],而我们的字典文件中共有479623个单词。打开词典文件,可以发现单词是按字典序排列的,而且单词排列的很密,存在很多“相似度”很高的单词,实际也没有要求随机性那么良好的随机数。因此将随机数乘以一个常数后对单词总数取余,这里常数选用一个质数(为什么是质数?质数很有很多神奇的地方。脚本中使用37,主要想
RANDOM乘以常数取余后,能尽量覆盖整个0−479623)(当然,因为C/C++生成的随机数范围要比shell的
RANDOM范围大的多,但是用C/C++方式的实现要比shell来的麻烦一些)
#!/bin/bash
#randomWords.sh
#词典文件所在路径
filepath=/usr/share/dict/words
#生成的结果文件
resultFile=./result.txt
#词典文件中总共有多少个单词
totalWordsNum=`wc -l $filepath | awk '{print $1}'`
idx=1
#NUM为要生成的随机单词的个数
NUM=100
declare -i num
declare -i randNum
ratio=37
while [ "$idx" -le "$NUM" ]
do
a=$RANDOM
num=$(( $a*$ratio ))
randNum=`expr $num%$totalWordsNum`
echo $randNum
sed -n "$randNum"p $filepath >> $resultFile
idx=`expr $idx + 1`
done
另外发现如果你的文本编辑器默认以windows风格的换行,在调试时,会报语法错
‘syntax error near unexpected token `’
这是因为在windows环境下换行默认是 \r\n,Linux环境则是\n,需要进行转换,在Linux环境中可以用dos2unix来转换。在Windows环境中可以借助Notepad++来转换
方法是菜单项编辑->文档格式转换->转换为Unix格式;使用sublime的话,暂未找到默认设置的为Unix格式的方式。