日常随笔

Linux生成随机数

2022-10-18  本文已影响0人  Surpassme

    在日常测试过程中,需要经常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

    示例如下所示:

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

1.6 利用uuid生成随机数

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

上一篇下一篇

猜你喜欢

热点阅读