Shell下有时需要使用随机数,在此总结产生随机数的方法。计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数)。伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产生算法将可以产生一个非常长的不重复的序列。
1.通过系统环境变量($RANDOM)实现
RANDOM的随机数范围为0~32767,如果想用其生成加密字符串的话,加入salt字符,然后执行md5sum,这样就可以生成随机密码。
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
2.通过openssl产生随机数
openssl rand 用于产生指定长度个bytes的随机字符。-base64或-hex对随机字符串进行base64编码或用hex格式显示。
用来生成数字字母组合:
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
3.通过时间(date)获得随机数
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
4.使用awk的rand()函数
rand()函数,返回任意数字 n,其中 0
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
注意:在同一秒内,生成的随机数的值是一样的。
只有更换srand的随机种子,才可以在同一秒内生成不一样的随机数:
5.通过/dev/random及/dev/urandom配合cksum生成随机数
/dev/random存储系统当前运行的环境的实时数据,可以看作系统某时候的唯一值数据,提供优质随机数。但是其产生的速度较慢。/dev/urandom是非阻塞的随机数产生器,读取时不会产生阻塞,速度更快、安全性较差的随机数发生器。
使用dd命令从这些设备中copy数据流,发现速度差异很大:
其中 strings -n设置字符串的字符数,head -n设置输出的行数。
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
6.通过UUID生成随机数
UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),UUID格式是:包含32个16进制数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内。cat /proc/sys/kernel/random/uuid每次获取到的数据都会不同。
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
7.使用expect附带的mkpasswd生成随机数
mkpasswd命令依赖于包expect,使用yum -y install expect命令安装。
通过man mkpasswd查看其参数说明:
-l 指定密码的长度,默认为9位。
-d 指定密码中数字的数量,默认2位。
-c 指定密码中小写字母的数量,默认2位。
-C 指定密码中大写字母的数量,默认2位。
-s 指定密码中特殊字符的数量,默认为1位。
那如何用它来生成超过五位数并指定范围的随机数呢?
输出结果:
综合案例
1.连续掷骰子1000次,统计1-6点投中的次数。
输出结果:
2.批量创建10个系统账户,要求用户名从user01-user10,密码随机字符串
输出结果:
3.编写一个猜大小的游戏,并记录得分。
输出结果:
总结
(1)Shell产生伪随机数的函数$RANDOM,能方便满足大部分的需求;
(2)个人推荐$RANDOM和awk rand()函数;
(3)以上方法不止能生成随机数,也能够生成随机字符串;
(4)配合cksum和md5sum可以提供强大的随机数字和随机字符串生成功能;
(5)产生随机数的方法还有很多并且可以扩展,扩展思路才能选择最近最优的方式。
领取专属 10元无门槛券
私享最新 技术干货