1.date方式
获取随机数:date +%N%s
获取随机字符串:date +%N%s|md5sum|cut -c1-10|tr '0-9' 'a-z'
注:
date +%N 获得当前时间的纳秒数据,精确到亿分之一秒,在多核CPU大量循环里面,也可能有相同随机数碰撞
date +%s 获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数,在做循环任务时,多线程同时执行不能满足要求
所以我们用date +%N%s
详情看代码:
#获取随机数
[root@ansible01 ~]# date +%N%s
7753063281719364108
#获取随机字符串
[root@ansible01 ~]# date +%N%s|md5sum |cut -c 1-10|tr '0-9' 'a-z'
adjdeeeadb
2./dev/random与/dev/urandom方式
/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流
这两个设备的差异在于:/dev/random的random依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机性
获取随机数:tr -dc '0-9' </dev/random | head -c 10
获取随机字符串:tr -cd 'a-z' </dev/urandom|head -c10
详情请看代码:
#获取随机数以及命令运行时间
[root@ansible01 ~]# tr -dc '0-9' </dev/random | head -c 10
5265370806
[root@ansible01 ~]# time tr -dc '0-9' </dev/random | head -c 10
5446642762
^C
real 0m27.923s
user 0m0.000s
sys 0m0.080s
#获取随机字符串以及命令运行时间
[root@ansible01 ~]# tr -cd 'a-z' </dev/urandom|head -c10
ezaickkrin
[root@ansible01 ~]# time tr -cd 'a-z' </dev/urandom|head -c10
ytbwoimtul
real 0m0.003s
user 0m0.004s
sys 0m0.000s
对比能够看出在对/dev/random取随机数时,会很慢,不建议使用,我们可以只用/dev/urandom来获取
#获取随机数以及命令运行时间
[root@ansible01 ~]# tr -cd '0-9' </dev/urandom|head -c10
8359693358
#获取随机字符串以及命令运行时间
[root@ansible01 ~]# tr -cd 'a-z' </dev/urandom|head -c10
ezaickkrin
3.使用内部系统变量($RANDOM)
$RANDOM是一个内置变量,用于生成一个介于1和32767之间的随机整数
#生成随机数
[root@ansible01 ~]# echo $RANDOM
10833
#生成一个[1, max) 随机数
$RANDOM * $max / 32767 + 1;
#生成一位、二位、三位、四位、五位随机数,最大只能生成五位随机数
[root@ansible01 ~]# echo $(( $RANDOM % 10 + 1 ))
7
[root@ansible01 ~]# echo $(( $RANDOM % 100 + 1 ))
71
[root@ansible01 ~]# echo $(( $RANDOM % 1000 + 1 ))
962
[root@ansible01 ~]# echo $(( $RANDOM % 10000 + 1 ))
5009
[root@ansible01 ~]# echo $(( $RANDOM % 100000 + 1 ))
25564
#生成随机字符串
[root@ansible01 ~]# echo $RANDOM|tr "0-9" "a-z"
bafic