一、问题
Shell下有时需要使用随机数,在此总结产生随机数的方法。计算机产生的的只是“伪随机数”,不会产生绝对的随机数(是一种理想随机数)。伪随机数在大量重现时也并不一定保持唯一,但一个好的伪随机产生算法将可以产生一个非常长的不重复的序列。
二、随机数
1、生成随机数的七种方法
(1)通过内部系统变量($RANDOM)
echo $RANDOM
生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/bin/bash
function rand(){
min=$
1
max=$(($
2
-$min+
1
))
echo $(($num%$max+$min))
}
rnd=$(rand
400000
500000
)
echo $rnd
exit
0
|
在shell中有一个环境变量RANDOM,它的范围是0--32767
如果我们想要产生0-25范围内的数,如何做呢?如下:
$RANDOM%26 echo$RANDOM%26|bc 13
用这个环境变量对26取模,就可以得到最小是0,最大是25的数了。
如果想得到1--68范围内的数,可以这样
$RANDOM%68+1,
前面可以得到最小为0,最大为67的随机数,再加上1,很自然的就可以得到最大为1,最小为68的数了。
如果想得到6--87范围内的数。可以这样
$RANDOM%82+6,
前面可以得到最小为0,最大为81的随机数,再加上6,很自然的就可以得到最大为87,最小为6的数了。
等等,其它范围内的数一样可以用这种方法产生,用上面的三个例子,总结出规律来
可以类推其它范围内数了
awk 'BEGIN{srand();print rand()*1000000}' #可以加上if判断,779644
(3)openssl rand产生随机数
openssl rand 用于产生指定长度个bytes的随机字符。-base64或-hex对随机字符串进行base64编码或用hex格式显示。
openssl rand -base64 8 | md5sum | cut -c1-8 #八位字母和数字的组合,3a61800e
openssl rand -base64 8 | cksum | cut -c1-8 #八位数字,10784736
(4)通过时间获得随机数(date)
date +%s%N #生成19位数字,1287764807051101270
date +%s%N | cut -c6-13 #取八位数字,21793709
date +%s%N | md5sum | head -c 8 #八位字母和数字的组合,87022fda
num=$(date +%s%N)
1
50
(5)通过系统内唯一数据生成随机数(/dev/random及/dev/urandom)
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@H_309_502@
37
38
39
40
41
|
#!/bin/bash
#RANDOM=$$
PIPS=
6
MAX=
1000
throw
=
1
one=
0
two=
0
three=
0
four=
0
five=
0
six=
0
count()
{
case
"$1"
in
0
) let
"one=one+1"
;;
"two=two+1"
;;
"three=three+1"
;;
3
"four=four+1"
;;
4
"five=five+1"
;;
5
"six=six+1"
;;
esac
}
"$throw"
"$MAX"
]
do
"dice=RANDOM % $PIPS"
count $dice
"throw=throw+1"
done
"The statistics results are as follows:"
"one=$one"
"two=$two"
"three=$three"
"four=$four"
"five=$five"
"six=$six"
|
RANDOM产生的随机数基本在平均值左右浮动(即方差较小)。
(3)批量创建10个系统帐号,密码随机
先看看指定用户密码的脚本:
7