Shell 中运用随机数

1. 使用系统的 $RANDOM 变量

$RANDOM 的范围是 [0, 32767]

注意: 在 bash 脚本中每次使用该变量都是不同的值, 如果需要在多处使用, 那么需要定义一个新的变量存储该值

1
2
3
FILENAME=UTC-2018-04-18-13-42-54-${RANDOM}
## write ${FILENAME}
## read ${FILENAME}

而不要直接

1
2
## write UTC-2018-04-18-13-42-54-${RANDOM}
## read UTC-2018-04-18-13-42-54-${RANDOM}

2. $RANDOM 生成超过 32767 的随机数

1
2
3
4
5
6
7
8
9
function rand(){
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000)) #增加一个10位的数再求余
echo $(($num%$max+$min))
}

rnd=$(rand 400000 500000)
echo $rnd

3. 使用 date +%s%N

生成 1~50 的随机数

1
2
3
4
5
6
7
8
9
function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}

rnd=$(rand 1 50)
echo $rnd

4. 使用/dev/random 和 /dev/urandom

/dev/random 存储着系统当前运行环境的实时数据,是阻塞的随机数发生器,读取有时需要等待。

/dev/urandom 非阻塞随机数发生器,读取操作不会产生阻塞。

例:使用/dev/urandom 生成 100~500 的随机数,使用 urandom 避免阻塞。

1
2
3
4
5
6
7
8
9
function rand(){
min=$1
max=$(($2-$min+1))
num=$(cat /dev/urandom | head -n 10 | cksum | awk -F ' ' '{print $1}')
echo $(($num%$max+$min))
}

rnd=$(rand 100 500)
echo $rnd

5. 使用 linux uuid

uuid 全称是通用唯一识别码,格式包含 32 个 16 进制数字,以’-‘连接号分为 5 段。形式为 8-4-4-4-12 的 32 个字符

cat /proc/sys/kernel/random/uuid

使用 linux uuid 生成 100~500 随机数

1
2
3
4
5
6
7
8
9
function rand(){
min=$1
max=$(($2-$min+1))
num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
echo $(($num%$max+$min))
}

rnd=$(rand 100 500)
echo $rnd

6. 生成随机字符串

使用 date 生成随机字符串

date +%s%N | md5sum | head -c 10

使用 /dev/urandom 生成随机字符串

cat /dev/urandom | head -n 10 | md5sum | head -c 10

参考文档: https://blog.csdn.net/fdipzone/article/details/24329523

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.