Linux生成随机数的多种方法

通过内部系统变量 $RANDOM

1
2
3
[user1@study ~]$ echo $RANDOM
12489
[user1@study ~]$

如果超过 5 位可以加个固定 10 位整数,然后进行求余。生成 400000~500000 的随机数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash    

function rand(){
min=$1
max=$(($2-$min+1))
# 生成0-32767之间的整数随机数
# num=$(echo $RANDOM)
# 若要生成5位数以上的随机数,则需要加个固定10位整数,然后进行求余,如下:
num=$(($RANDOM+1000000000)) #增加一个10位的数再求余
echo $(($num%$max+$min))
}

rnd=$(rand 300000 600000)
echo $rnd

exit 0

使用 awk 命令的随机函数

1
2
3
[user1@study ~]$ awk 'BEGIN{srand();print rand()*1000000}' 
779019
[user1@study ~]$
1
awk 'function irand(min, max){max= max - min + 1;num= rand() * 1000000000;return int(num % max + min);}!a[$1]++{print $1,irand(1,30) }' filename

使用 openssl 命令产生随机数

openssl rand 用于产生指定长度个bytes的随机字符。-base64或-hex对随机字符串进行base64编码或用hex格式显示。

1
2
3
4
5
6
[user1@study ~]$ openssl rand -base64 8 | md5sum | cut -c1-8      # 八位字母和数字的组合
5f8aa9c1
[user1@study ~]$
[user1@study ~]$ openssl rand -base64 8 | cksum | cut -c1-8 # 八位数字
25627052
[user1@study ~]$

通过 date 从时间获得随机数

1
2
3
4
5
6
7
8
[user1@study ~]$ date +%s%N  # 生成19位数字
1437297460176572314
[user1@study ~]$
[user1@study ~]$ date +%s%N | cut -c6-13 # 取八位数字
97471199
[user1@study ~]$
[user1@study ~]$ date +%s%N | md5sum | head -c 8 # 八位字母和数字的组合
68b50c31[user1@study ~]$

生成 1~50 的随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash    

function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}

rnd=$(rand 1 50)
echo $rnd

exit 0

通过系统内唯一数据生成随机数

/dev/random 存储系统当前运行的环境的实时数据,可以看作系统某时候的唯一值数据,提供优质随机数。

/dev/urandom 是非阻塞的随机数产生器,读取时不会产生阻塞,速度更快、安全性较差的随机数发生器。

1
2
3
[user1@study ~]$ head -n 10 /dev/urandom | md5sum | head -c 10
96fac9b325[user1@study ~]$
[user1@study ~]$

生成全字符的随机字符串

1
2
3
[user1@study ~]$ strings -n 8 /dev/urandom | head -n 1
ayU!iwR?
[user1@study ~]$

生成数字加字母的随机字符串,其中 strings -n 设置字符串的字符数,head -n 设置输出的行数。

1
2
3
[user1@study ~]$ sed -e 's/[^a-zA-Z0-9]//g' /dev/urandom | strings -n 8 | head -n 1
DwNJNIp4Ff
[user1@study ~]$

urandom 的数据很多使用 cat 会比较慢,可以使用 head 读200行,再用 cksum 将读取文件内容生成唯一的表示整型数据,cut" " 分割然后得到分割的第一个字段数据

1
2
3
4

[user1@study ~]$ head -200 /dev/urandom| cksum |cut -d" " -f1
2185818
[user1@study ~]$

读取 Linux的 uuid

UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID)。它格式是:包含32个16进制数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。

Linux的UUID码也是由内核提供的,在 /proc/sys/kernel/random/uuid 这个文件内。每次查看此文件结果都会不同。

1
2
3
[user1@study ~]$ cat /proc/sys/kernel/random/uuid 
bd777e6e-820e-443b-83d9-b8fc8ba65de8
[user1@study ~]$

获取不同的随机整数

1
2
3
[user1@study ~]$ cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" " 
428476922
[user1@study ~]$

使用 uuid 生成 100~500 随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash    

function rand(){
min=$1
max=$(($2-$min+1))
num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
echo $(($num%$max+$min))
}

rnd=$(rand 100 500)
echo $rnd

exit 0

从元素池中随机抽取取

1
2
3
pool=(a b c d e f g h i j k l m n o p q r s t 1 2 3 4 5 6 7 8 9 10)
num=${#pool[*]}
result=${pool[$((RANDOM%num))]}

用于生成一段特定长度的有数字和字母组成的字符串,字符串中元素来自自定义的池子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash  

length=8
i=1

seq=(0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

num_seq=${#seq[@]}

while [ "$i" -le "$length" ];do
seqrand[$i]=${seq[$((RANDOM%num_seq))]}
let "i=i+1"
done

echo "The random string is: "
for j in ${seqrand[@]};do
echo -n $j
done
echo

使用 mkpasswd 命令

需要安装 expect

1
2
3
[user1@study ~]$ mkpasswd 
#FldwzX55
[user1@study ~]$

生成 13 位的密码

1
2
3
[user1@study ~]$ mkpasswd -l 13 
3E"pmkxnm3itP
[user1@study ~]$
有钱任性,请我吃包辣条
0%