首页 > 系统 > Linux > 正文

linux shell实现随机数几种方法分享(date,random,uuid)

2019-10-26 18:47:15
字体:
来源:转载
供稿:网友

在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签。呵呵,非常简单就可以实现。那么在做程序设计,真的要通过自己程序设计出随机数那还真的不简单了。现在很多都是操作系统内核会提供相应的api,这些原始参数是获取一些计算机运行原始信息,如内存,电压,物理信号等等,它的值在一个时间段可以保证是唯一的了。好了,废话我就不说了。呵呵。

shell脚本程序我们有那些获得随机数方法呢?

一、通过时间获得随机数(date)

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

例子:

[chengmo@centos5  shell]$ date +%s1287764773#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数#如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。 [chengmo@centos5  shell]$ date +%N738710457#获得当前时间的纳秒数据,精确到亿分之一秒。#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞 [chengmo@centos5  shell]$ date +%s%N1287764807051101270#这个可以说比较完美了,加入了时间戳,又加上了纳秒

通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。

#!/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

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表