Linux生成随机数
在日常测试过程中,需要经常Mock部分数据,使其看起来具有随机性,虽然可以通过高级程序语言来进行实现,也非常高效快捷。除此之外还有没有其他办法呢?今天我们来探讨一下,在Liunx中如何快速生成随机数。
本次所使用的环境为
CentOS 7.9.2009
版本
1.生成随机数
1.1 通过内置环境变量
系统内置的环境变量为:$RANDOM
,因此我们可以很方便在命令行
或Shell脚本
中进行调用。示例如下所示:
[Surpass@surpass ~]$ echo ${RANDOM}
32181
[Surpass@surpass ~]$ echo ${RANDOM}
25895
使用环境变量
RANDOM
生成的随机数据范围为:[0,32767]
1.2.通过date
生成随机数
通过date
命令可以很轻松的获取以日期
、时间
、时间戳
等及其组合
生成的随机数,如下所示:
[Surpass@surpass ~]$ echo $(date +%Y)
2022
[Surpass@surpass ~]$ echo $(date +%y)
22
[Surpass@surpass ~]$ echo $(date +%m)
10
[Surpass@surpass ~]$ echo $(date +%d)
16
[Surpass@surpass ~]$ echo $(date +%H)
17
[Surpass@surpass ~]$ echo $(date +%M)
51
[Surpass@surpass ~]$ echo $(date +%S)
33
[Surpass@surpass ~]$ echo $(date +%s)
1665913933
[Surpass@surpass ~]$ echo $(date +%N)
282095646
[Surpass@surpass ~]$ echo $(date +%j)
289
[Surpass@surpass ~]$ echo $(date +%W)
41
[Surpass@surpass ~]$ echo $(date +%w)
0
[Surpass@surpass ~]$ echo $(date +%s%N)
1665914047328810115
[Surpass@surpass ~]$ echo $(date +%N) | cut -c 2-5
2591
1.3.通过文件CRC
功能生成随机数
[Surpass@surpass ~]$ head -n 5 /dev/random | cksum | tr -d " "
2040488746800
[Surpass@surpass ~]$ head -n 5 /dev/random | cksum | tr -d " "
20130480601348
1.4 通过awk
生成随机数据
[Surpass@surpass ~]$ awk 'BEGIN {srand();print rand()*1000000}'
656048
1.5 通过openssl
生成随机数
在使用openssl生成随机数据,其主要用法如下所示:
Surpass@surpass ~]$ openssl rand -h
Usage: rand [options] num
where options are
-out file - write to file
-engine e - use engine e, possibly a hardware device.
-rand file:file:... - seed PRNG from files
-base64 - base64 encode output
-hex - hex encode output
- options主要使用的参数为
base64
和hex
用于指定输出时字符的编码方式 - num:生成字符的长度
示例如下所示:
[Surpass@surpass ~]$ openssl rand -hex 8
bd716306d68dc555
[Surpass@surpass ~]$ openssl rand -base64 8
dith7RwX07w=
1.6 利用uuid
生成随机数
UUID是Universally Unique Identifier的缩写,通常翻译为通用唯一识别码
,因在所有时间和空间上具有唯一性,常用于分布式系统,用于全局唯一标识数据,如索引等。其格式通常由32
个16进制字符
组成,使用-
分隔为5
段,每段数量依次为8-4-4-4-12
,在Python快速生成的UUID的方法如下所示:
import uuid
print(uuid.uuid4()) # ccda0d10-ecda-4d9e-b8ed-b893cfa0cc13
在Liunx中,我们也可以利用系统自带的功能快速生成UUID,示例如下所示:
[Surpass@surpass ~]$ cat /proc/sys/kernel/random/uuid
9f0691a1-da3c-4dbc-89c5-213c86212b66
1.7 使用Hash
功能生成随机数
Linux中的工具md5sum
、sha1sum
、sha256sum
、一般用于生成的文件的Hash
码,如果一个文件没有发生更改,则文件Hash
不会发生变化,利用这一特性,我们可以生成随机数据,示例如下所示:
[Surpass@surpass ~]$ head -n 5 /dev/random | md5sum | tr -d " " | tr -d "-"
9c6cb9c9bec984ff087fa45c3e36165d
[Surpass@surpass ~]$ head -n 5 /dev/random | sha1sum | tr -d " " | tr -d "-"
f7b62a311e7de3427ead5e1d0063080b2638a52e
[Surpass@surpass ~]$ head -n 5 /dev/random | sha256sum | tr -d " " | tr -d "-"
f68a98b49c00f2bdaa12a14f4ca79c8202b463653a2bb8ac24dbbeabe78c0921
1.8 使用shuf
生成随机数
shuf
在Linux中常用于生成随机的排列,因此也是可以用来生成随机数的。示例如下所示:
[Surpass@surpass ~]$ shuf -i 100-900 -n 1
512
[Surpass@surpass ~]$ shuf -i 100-900 -n 1
638
[Surpass@surpass ~]$ shuf -i 100-900 -n 1
180
[Surpass@surpass ~]$ shuf -i 100-900 -n 1
397
其常用参数如下所示:
参数 | 功能 |
---|---|
-e,--echo | 将每个ARG做为输入行 |
-i, --input-range=LO-HI | 将数字范围LO(最小值)-HI(最高)之间的数值做为输入行 |
-n, --head-count=COUNT | 输出行数范围 |
-r, --repeat | 允许输出重复 |
若系统没有该命令,可以使用该命令进行安装
sudo yum -y install coreutils
2.自定义生成随机数
2.1 生成指定范围内的随机数据
示例代码如下所示:
#!/bin/bash
# Author: Surpass
# Date: 2022-10-16
function printMessage(){
dt=$(date '+%F %T')
type=$([ -z "$1" ] && echo "INFO" || echo "$1" | tr [:lower:] [:upper:])
message=$([ -z "$2" ] && echo "NONE" || echo "$2")
if [ "${type}" == "INFO" ]
then
echo -e "\033[32m ${dt} ${type} ${message}\033[0m"
elif [ "${type}" == "WARNING" ]
then
echo -e "\033[33m ${dt} ${type} ${message}\033[0m"
elif [ "${type}" == "ERROR" ]
then
echo -e "\033[31m ${dt} ${type} ${message}\033[0m"
else
echo -e "\033[34m ${dt} ${type} or ${message} error \033[0m"
fi
}
function createRandomNumer(){
minNum=$1
maxNum=$2
range=$((${maxNum}-${minNum}+1))
tmpRandomNum=$(awk 'BEGIN {srand();print rand()*1000000}')
randomNumer=$((${tmpRandomNum}%${range}+${minNum}))
echo ${randomNumer}
}
function main(){
if [ $# -lt 2 ]
then
printMessage error "Must be two parameter,please check "
exit 255
fi
createRandomNumer $1 $2
}
main $1 $2
最终运行结果如下所示:
[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 9000
4312
[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 9000
6077
[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 9000
6077
[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 9000
6077
[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 9000
3929
[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 9000
6656
2.2 使用自定义数组生成随机数
利用数组根据索引取值功能,我们可以先生成一个数组,然后产生一个随机索引,从而达到随机功能,示例代码如下所示:
#!/bin/bash
# Author: Surpass
# Date: 2022-10-16
function printMessage(){
dt=$(date '+%F %T')
type=$([ -z "$1" ] && echo "INFO" || echo "$1" | tr [:lower:] [:upper:])
message=$([ -z "$2" ] && echo "NONE" || echo "$2")
if [ "${type}" == "INFO" ]
then
echo -e "\033[32m ${dt} ${type} ${message}\033[0m"
elif [ "${type}" == "WARNING" ]
then
echo -e "\033[33m ${dt} ${type} ${message}\033[0m"
elif [ "${type}" == "ERROR" ]
then
echo -e "\033[31m ${dt} ${type} ${message}\033[0m"
else
echo -e "\033[34m ${dt} ${type} or ${message} error \033[0m"
fi
}
function getRandomNumber(){
minNum=$1
maxNum=$2
randomArray=($(eval echo {${minNum}..${maxNum}}))
randomArrayLength=${#randomArray[*]}
randomNum=${randomArray[$((${RANDOM}%${randomArrayLength}))]}
echo ${randomNum}
}
function main(){
if [ $# -lt 2 ]
then
printMessage error "Must be two parameter,please check "
exit 255
fi
getRandomNumber $1 $2
}
main $1 $2
最终运行结果如下所示:
[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999
246
[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999
664
[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999
451
[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999
751
[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999
439
[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100
2022-10-16 23:07:47 ERROR Must be two parameter,please check
Linux中生成数字序列参考文档:Shell 生成数字序列