Shell编程实现随机函数

来源:互联网 发布:微信淘宝客返利机器人 编辑:程序博客网 时间:2024/05/22 03:40

采用Shell编程实现随机函数(包括整数、符点数、字符、日期时间),顺便与AWK实现作下性能对比


Shell(bash)实现的随机函数(保存在random_function.sh文件):

#!/bin/bash

#
# 产生各类型数据随机函数(BASH实现)
# chm,
461810517@qq.com
# 2011/11/16
#

# BASH中RANDOM伪变量,会随机产生0到32767之间的整数
RANDOM_MAX_INT=32768

# 产生随机整数, 其值大于等于min, 小于等于max
function random_int() {
  local min=$1
  local max=$2
  local random=$( echo "${min}+${RANDOM}/${RANDOM_MAX_INT}*(${max}-${min}+1)" | bc -l )
  echo -n ${random%.*}
}

# 产生随机浮点数, 其整数部分位数最大为precision, 小数部分位数最大为scale
# printf函数会进行四舍五入操作
function random_float() {
  local precision=$1
  local scale=$2
  local random=$( echo "${RANDOM}/${RANDOM_MAX_INT}*(10^${precision}) + ${RANDOM}/${RANDOM_MAX_INT} " | bc -l )
  printf "%.${scale}f" ${random}
}

# 产生长度为len的随机字符串
# opt为"lower"时, 产生由小写字母构成的随机字符串; opt为"upper"时, 产生由大写字母构成的随机字符串; opt为其它时, 产生大小写字母构成的随机字符串
function random_string() {
  local opt=$1
  local len=$2
  local alphabet=(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 I M N O P Q R S T U V W X Y Z\
                  0 1 2 3 4 5 6 7 8 9)
  if [ ${opt} == "lower" ]; then
    alphabet=(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)
  elif [ ${opt} == "upper" ]; then
    alphabet=(A B C D E F G H I J K I M N O P Q R S T U V W X Y Z)
  fi
 
  for ((i=0; i<${len}; i++))
  do
    echo -n ${alphabet[ $(random_int 0 $((${#alphabet[@]}-1)) ) ]}
  done
}

# 产生格式为format的随机日期时间值
# begin_time, end_time格式: yyyy-mm-dd HH:MM:SS[ DST]
# format: 日期时间格式, 如"+%Y-%m-%d %H:%M:%S"
function random_time() {
  local begin_time=$( date -d "$1" "+%s" )
  local end_time=$( date -d "$2" "+%s" )
  echo -n $( date -d "$1 GMT +$( random_int 1 $((end_time-begin_time+1)) ) seconds" "$3" )
}

测试脚本(取名random_test.sh):

#!/bin/bash
source ./random_function.sh
COLUMN_DATA_SEP="|"

for (( i=0; i<1000; i=i+1 ))
do
  random_int 10 100
  echo -n ${COLUMN_DATA_SEP}
  random_float 3 2
  echo -n ${COLUMN_DATA_SEP}
  random_string "lower" 5
  echo -n ${COLUMN_DATA_SEP}
  random_time "2009-06-01 12:30:30" "2011-07-15 23:59:59" "+%Y-%m-%d %H:%M:%S"
  echo
done

 运行random_test.sh:
./random_test.sh
注:必须为random_test.sh添加可执行权限

与AWK实现进行性能比较:
采用random_test.sh进行测试,AWK将条数同样配置成1000条,测试发现:Shell耗时13s、AWK耗时0.01s。
注:AWK实现参考【采用AWK编程实现随机函数(包括整数、浮点数、字符串、日期时间)】


0 0
原创粉丝点击