Shell(Bash) - 随机数的生成

 随机数常用的四种方法

第一种方法、使用shell变量$RANDOM
echo $RANDOM 生成的是整数随机数 范围为: 0 - 32767 (带符号的16位整数).
这个是最为调用的方式。使用BASH内置的$RANDOM函数。(不过奇怪的是我是用#!/bin/sh 却不能调用)
【sh调用执行脚本,相当于打开了bash的POSIX标准模式 (等效于bash的 --posix 参数)】
例如传说中第一次见绝对晕的随机数生成脚本
------------------------------------------------------------------------------------
MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+="
LENGTH="9"
while [ "${n:=1}" -le "$LENGTH" ]
do
        PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"
        let n+=1
done
        echo "$PASS"
exit 0
--------------------------------------------------------------------------------------
[[ $# != 1 || $1 > 50 ]]&&{ echo "Usage ${0##/*} num";exit 1; }
array=(a b c d e f g h i j k l m n o p q r s t u v /
w x y z A B C D E F G H I J K L M N O P Q R S T U V/
W X Y Z 0 1 2 3 4 5 6 7 8 9)
dodo(){
        echo -n ${array[$((RANDOM%${#array[@]}))]}
}
i=1
n=$1
while((i<=n));do
        dodo
        ((i++))
done 2>/dev/null
echo
--------------------------------------------------------------------------------------

第二种方法、使用awk的随机函数
awk 'BEGIN{srand();print rand()}'
这个没有使用过........

第三种方法、使用系统设备文件/dev/random 和 /dev/urandom
dd if=/dev/random | od -a |sed 's/[^ ]*//;s/ //g' | head -3
dd if=/dev/urandom | od -a |sed 's/[^ ]*//;s/ //g' | head -3  
/dev/random 提供优质随机数。
/dev/urandom提供伪随机数。速度更快、安全性较差的随机数发生器。

例如:echo $((16#`dd if=/dev/urandom bs=1 count=4 2>/dev/null| od -A n -t x4|sed s/[^1-9a-fA-F]//g`))%1024|bc

分开来看:
echo $((16#ABC))  意思是将十六进制数ABC转换成十进制数
`command` 意思是两个`中间的命令执行结果做为外壳命令的参数
/dev/urandom 是个生成随机数的设备,比/dev/random稍不安全,但产生速度极快
dd if=/dev/urndom bs=1 count=4 从随机数设备中取前4个字节(32位数)
2>/dev/null 意思是将错误信息重定向到空设备中
od -A n -t x4 意思是将dd过来的数据(一个随机的32位值)进行转换输出,-A n是不输出偏移标志,-t x4是将数字用16进制输出,并且4个字节一组,这样就以16进制输出一个32位的数
sed s/[^1-9a-fA-F]//g 意思是去年输出文件中非十六进制可接受的字符(此例中主要是删除行前的空格,也可以用tr -d ' ' 或 awk '{print $1}'处理)
1024|bc 生成特定运算结果 生成0-1023范围内的随机数

----------------------------------------------------------------
cut 命令的使用
cut -d: -f 1 /etc/passwd > /tmp/users
-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段
当然也可以通过cut取得文件中每行中特定的几个字符,例如:
cut -c3-5 /etc/passwd
就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和 -f 参数可以跟以下子参数:
N 第N个字符或字段
N- 从第一个字符或字段到文件结束
N-M 从第N个到第M个字符或字段
-M 从第一个到第N个字符或字段
-----------------------------------------------------------------
我最后选用这种方法实现16和8位的密码集【A-Za-z0-9】之间的随机字符
bit(){
while [ ! $1 = ${#BIT} ]
do
BIT=`dd if=/dev/urandom | od -a |sed 's/[^1-9a-fA-F]//g' | head -1 | cut -c-$1`
done
return
}
在bit 8;$BIT;  bit 16 ;$BIT; 来获得16位及8位的密码
-----------------------------------------------------------------

第四种方法、date命令生成的纳秒数作为随机数
date  --rfc-3339=ns|sed -n "s/.*/.0*/(.*/)+.*//1/p"
命令也可以用:
date  --rfc-3339=ns|sed "s//.0*/|+//n/g"|sed -e 1d -e 3d

date  --rfc-3339=ns|awk -F "[ /t.+]" '{printf("%d/n",$3)}'
不太熟悉,没有使用过上面的方法。

以上部分为【转载】:
http://zhangyu.blog.51cto.com/197148/172782】第三及第四种方法
http://hi.baidu.com/aaronike/blog/item/0072533d1068a5e83c6d97ea.html】SH及BASH的区别
【有部分地址不详】

你可能感兴趣的:(shell,command,脚本,bash,Random,Matrix)