? ? 在日常測驗程序中,需要經常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 生成數字序列
原文地址:https://www.jianshu.com/p/69451fa92a6c
本文同步在微信訂閱號上發布,如各位小伙伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼添加關注:

作者: Surpassme
來源: http://www.jianshu.com/u/28161b7c9995/
http://www.cnblogs.com/surpassme/
宣告:本文著作權歸作者所有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出 原文鏈接 ,否則保留追究法律責任的權利,如有問題,可發送郵件 聯系,讓我們尊重原創者著作權,共同營造良好的IT朋友圈,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/517610.html
標籤:其他
上一篇:leetcode 380. Insert Delete GetRandom O(1) O(1) 時間插入、洗掉和獲取隨機元素 (中等)
