在日常测试过程中,需要经常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-52591
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 -hUsage: rand [options] numwhere 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 8bd716306d68dc555[Surpass@surpass ~]$ openssl rand -base64 8dith7RwX07w=
1.6 利用uuid
生成随机数
UUID是Universally Unique Identifier的缩写,通常翻译为通用唯一识别码
,因在所有时间和空间上具有唯一性,常用于分布式系统,用于全局唯一标识数据,如索引等。其格式通常由32
个16进制字符
组成,使用-
分隔为5
段,每段数量依次为 8-4-4-4-12
,在Python快速生成的UUID的方法如下所示:
import uuidprint(uuid.uuid4()) # ccda0d10-ecda-4d9e-b8ed-b893cfa0cc13
在Liunx中,我们也可以利用系统自带的功能快速生成UUID,示例如下所示:
[Surpass@surpass ~]$ cat /proc/sys/kernel/random/uuid9f0691a1-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 1512[Surpass@surpass ~]$ shuf -i 100-900 -n 1638[Surpass@surpass ~]$ shuf -i 100-900 -n 1180[Surpass@surpass ~]$ shuf -i 100-900 -n 1397
其常用参数如下所示:
参数 | 功能 |
---|---|
-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-16function 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 90004312[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 90006077[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 90006077[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 90006077[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 90003929[Surpass@surpass ~]$ bash createRandomNumber.sh 1000 90006656
2.2 使用自定义数组生成随机数
利用数组根据索引取值功能,我们可以先生成一个数组,然后产生一个随机索引,从而达到随机功能,示例代码如下所示:
#!/bin/bash# Author: Surpass# Date: 2022-10-16function 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 999246[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999664[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999451[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999751[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 999439[Surpass@surpass ~]$ bash createRandomNumberFromArray.sh 100 2022-10-16 23:07:47 ERROR Must be two parameter,please check
Linux中生成数字序列参考文档:Shell 生成数字序列
原文地址:https://www.jianshu.com/p/69451fa92a6c
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
作者: Surpassme
来源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 原文链接 ,否则保留追究法律责任的权利。如有问题,可发送邮件 联系。让我们尊重原创者版权,共同营造良好的IT朋友圈。