linux数组随机数,shell产生随机数的几种方法

我们知道,很多开发语言中,产生随机数的关键是需要一个随机数的基数。

shell 有多种方法获得随机数的基数。

一、时间命令产生伪随机数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:

复制代码 代码如下:

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:

复制代码 代码如下:

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中,每次执行的结果都是会不一样的。如果产生随机数的算法要做到真正的随机,则所有随机数的值的分布应该是均衡的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值