Linux Shell产生随机数的七种方法

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)产生随机数的方法还有很多并且可以扩展,扩展思路才能选择最近最优的方式。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20181217G0MKB700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券