shell生成随机数实例精讲 shell随机数二种生成方法

发布时间:2021-01-24编辑:脚本学堂
在shell中生成随机数的二种方法,使用时间命令产生伪随机数,$RANDOM 产生伪随机数,对shell生成随机数的原理与过程,进行了深入讲解,供大家学习参考。

shell生成随机数实例教程

shell中生成随机数的方法有很多,本文介绍二种方法,分别采用时间命令date与系统环境变量$RANDOM生成随机数。

对shell随机数生成原理不了解的话,可以参考:shell生成随机数的四种思路

一、linuxjishu/14052.html target=_blank class=infotextkey>date命令产生伪随机数

date 命令可以获得当前时间的纳秒值,这个值精确到亿分之一秒(范围 000000000~999999999)。可以利用这个纳秒值来产生伪随机数的基数。
例1,test.sh:
 

random ()
{
    local min=$1
    local max=$2
    local range=$(($max - $min + 1))
    number=$(($((10#$(date +%N))) % range + $min))
  
    echo $number
}
while true
do
    echo $LINENO `random 1 100`
    sleep 1
done
 

在命令提示符下输入 ./test.sh,将会循环产生 1~100 之间的伪随机整数。
使用 date 命令产生伪随机数的基数时,需要进行 10 进制转换。因为 $(date +%N) 的结果有可能是数字 0 开头的整数,shell 会将其识别为八进制数值,当数值中出现非八进制数字时,会出现错误(数值太大不可为算数进制的基)。

二、系统环境变量$RANDOM 产生伪随机数
$RANDOM 是 shell 的内部函数(不是变量),这个函数返回范围 0~32767 之间的一个伪随机整数。在 shell 中,常使用这个函数返回一个指定范围的伪随机数。
例2,test.sh:
 

numbers=(136 158 132 133 139 189)
while true
do
    index=$(($RANDOM % ${#numbers[*]}))
    echo numbers[$index]=${numbers[$index]}
    sleep 1
done
 

在命令提示符下输入 ./test.sh,将会循环产生 0~${#numbers[*]}-1 之间的数组索引。
RANDOM 产生的不是真正的随机数,如果每次使用相同的随机数种子,随机数将产生相同的序列。
因此,使用不同的随机数种子,将增加 RANDOM 产生真正随机数的几率。

例3,test.sh:
 

#!/usr/bin/bash
while true
do
    RANDOM=$((10#$(date +%N)))
    echo random=$RANDOM
    sleep 1
done
 

在命令提示符下输入 ./test.sh,将会循环产生 0~32767 之间的伪随机整数。

产生指定范围的被指定整数整除的随机数,通用算法:
 

random_number = random%(max - min + 1) + min + div - 1) / div * div

例4,test.sh:
 

复制代码 代码示例:
#!/usr/bin/bash
random ()
{
    local l_min=$1
    local l_max=$2
    local l_div=$3
    local l_range=$(($l_max - $l_min + 1))
  
    RANDOM=`date +%N`
    local number=$((($RANDOM % $l_range + $l_min + $l_div - 1) / $l_div * $l_div))
  
    echo $number
}
update_count ()
{
    case $1 in
    3) ((numbers[3]++)) ;;
    6) ((numbers[6]++)) ;;
    9) ((numbers[9]++)) ;;
    12) ((numbers[12]++)) ;;
    15) ((numbers[15]++)) ;;
    18) ((numbers[18]++)) ;;
    21) ((numbers[21]++)) ;;
    24) ((numbers[24]++)) ;;
    27) ((numbers[27]++)) ;;
    30) ((numbers[30]++)) ;;
    esac
}
count=0
readonly max_count=600
readonly g_min=1
readonly g_max=30
readonly g_div=3
while [ $count -lt $max_count ]
do
    update_count `random $g_min $g_max $g_div`
  
    ((count++))
done
echo numbers[3]=${numbers[3]}
echo numbers[6]=${numbers[6]}
echo numbers[9]=${numbers[9]}
echo numbers[12]=${numbers[12]}
echo numbers[15]=${numbers[15]}
echo numbers[18]=${numbers[18]}
echo numbers[21]=${numbers[21]}
echo numbers[24]=${numbers[24]}
echo numbers[27]=${numbers[27]}
echo numbers[30]=${numbers[30]}

执行结果:
numbers[3]=63
numbers[6]=47
numbers[9]=45
numbers[12]=55
numbers[15]=60
numbers[18]=63
numbers[21]=67
numbers[24]=69
numbers[27]=78
numbers[30]=53
在例4中,每次执行的结果都是会不一样的。
如果产生随机数的算法要做到真正的随机,则所有随机数的值的分布应该是均衡的。

shell生成随机数的一些例子


shell随机数进阶