Linux Shell 生成随机数和随机字符串的方法示例

2019-09-23 08:53:28于丽

日常生活中,会经常用到随机数,使用场景非常广泛,例如买彩票、丢骰子、抽签、年会抽奖等。

Shell 下如何生成随机数呢,米扑博客特意写了本文,总结 Linux Shell 产生随机数的多种方法。

计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数)。实际上,伪随机数和理想随机数也是相对的概念,例如伪随机数在1万万亿亿亿年内也无法重复,算是理想随机数么?

伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产生算法将可以产生一个非常长的不重复的序列,例如 UUID(通用唯一识别码)在100亿年内才可用完。

 1. 使用系统的 $RANDOM 变量(CentOS、Ubuntu、MacOS 都支持,但只有5位数随机)

mimvp@ubuntu:~$ echo $RANDOM
17617

$RANDOM 的范围是 [0, 32767]

示例:使用 for 循环来验证:

#!/bin/bash
# mimvp.com 2016.05.10

function print_random() {
  for i in {1..10};
  do
    echo -e "$i t $RANDOM"
  done
}

print_random

运行结果:

# sh mimvp_shell_rand.sh
1        20191
2        16817
3        25971
4        1489
5        34
6        25183
7        920
8        315
9        18845
10       29519

如需要生成超过32767的随机数,可以用以下方法实现(有缺陷)

例:生成 40,000,000~50,000,000 的随机数,但最后末尾五位数在随机变化,实现原理有缺陷

#!/bin/bash
# mimvp.com 2016.05.10

## Linux 系统随机数 + 范围上限值后, 再取余
function mimvp_random_bignum() {
  min=$1
  max=$2
  mid=$(($max-$min+1))
  num=$(($RANDOM+$max))    # 随机数+范围上限, 然后取余
  randnum=$(($num%$mid+$min)) # 随机数包含上下限边界数值
  echo $randnum
}

function print_random_bignum() {
  for i in {1..10};
  do
    bignum=$(mimvp_random_bignum 40000000 50000000)
    echo -e "$i t $bignum"
  done
}

print_random_bignum

运行结果:

# sh mimvp_shell_rand.sh 
1        40022422
2        40014261
3        40022712
4        40016695
5        40026575
6        40032198
7        40026667
8        40016024