linux shell实现随机数多种方法,shell 生成指定范围随机数与随机字符串.

jackxiang 2010-11-1 11:59 | |
零、使用系统的 $RANDOM 变量
echo $RANDOM  
17617  
$RANDOM 的范围是 [0, 32767]
如需要生成超过32767的随机数,可以用以下方法实现。

一、通过时间获得随机数(date)
这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。

例子:
[chengmo@centos5  shell]$ date +%s
1287764773
#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
#如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。

[chengmo@centos5  shell]$ date +%N
738710457
#获得当前时间的纳秒数据,精确到亿分之一秒。
#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞

[chengmo@centos5  shell]$ date +%s%N
1287764807051101270
#这个可以说比较完美了,加入了时间戳,又加上了纳秒
通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。

#!/bin/sh
#写个随机函数,调用方法random min max
#在min 与 max直接获得随机整数
#copyright chengmo QQ:8292669


#获得随机数返回值,shell函数里算出随机数后,更新该值

function random()
{
    min=$1;
    max=$2-$1;
    num=$(date +%s+%N);
    ((retnum=num%max+min));
    #进行求余数运算即可
    echo $retnum;
    #这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
    #还有一种返回,定义全价变量,然后函数改下内容,外面读取
}

#得到1-10的seq数据项
for i in {1..10};
do
    out=$(random 2 10000);
    echo $i,"2-10000",$out;
done;

看看运行结果:

[chengmo@centos5  shell]$ sh testrandom.sh
1,2-10000,5600
2,2-10000,5295
3,2-10000,3432
4,2-10000,3148
5,2-10000,9041
6,2-10000,4290
7,2-10000,2380
8,2-10000,9009
9,2-10000,5474
10,2-10000,3664

一个循环里面,得到值各不相同。

这个是我们常用方法,适应各种语言,是一个通用算法,就算服务器不提供,某时刻相同唯一数据标记,我们也可以通过这种方法,做自己的伪随机数。

来源:http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html
More: http://blog.csdn.net/fdipzone/article/details/24329523

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/3711/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-5-18 22:46
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]