日常生活中,会经常用到随机数,使用场景非常广泛,例如买彩票、丢骰子、抽签、年会抽奖等。
Shell 下如何生成随机数呢,米扑博客特意写了本文,总结 Linux Shell 产生随机数的多种方法。
计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数)。实际上,伪随机数和理想随机数也是相对的概念,例如伪随机数在1万万亿亿亿年内也无法重复,算是理想随机数么?
伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产生算法将可以产生一个非常长的不重复的序列,例如 UUID(通用唯一识别码)在100亿年内才可用完。
1. 使用系统的 $RANDOM 变量(CentOS、Ubuntu、MacOS 都支持,但只有5位数随机)
mimvp@ubuntu:~$ echo $RANDOM17617
$RANDOM 的范围是 [0, 32767]
示例:使用 for 循环来验证:
#!/bin/bash# mimvp.com 2016.05.10function 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
新闻热点
疑难解答