在日常测试过程中,需要经常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主要使用的参数为base64hex用于指定输出时字符的编码方式
  • num:生成字符的长度

    示例如下所示:

[Surpass@surpass ~]$ openssl rand -hex 8bd716306d68dc555[Surpass@surpass ~]$ openssl rand -base64 8dith7RwX07w=

1.6 利用uuid生成随机数

    UUID是Universally Unique Identifier的缩写,通常翻译为通用唯一识别码,因在所有时间和空间上具有唯一性,常用于分布式系统,用于全局唯一标识数据,如索引等。其格式通常由3216进制字符组成,使用-分隔为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中的工具md5sumsha1sumsha256sum、一般用于生成的文件的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朋友圈。