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

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

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

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

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

例子:

 1 [[email protected]  shell]$ date +%s
 2 1287764773
 3 #获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
 4 #如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。
 5
 6 [[email protected]  shell]$ date +%N
 7 738710457
 8 #获得当前时间的纳秒数据,精确到亿分之一秒。
 9 #这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞
10
11 [[email protected]  shell]$ date +%s%N
12 1287764807051101270
13 #这个可以说比较完美了,加入了时间戳,又加上了纳秒

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

 1 #!/bin/sh
 2
 3 #写个随机函数,调用方法random min max
 4 #在min 与 max直接获得随机整数
 5 #copyright chengmo QQ:8292669
 6
 7
 8 #获得随机数返回值,shell函数里算出随机数后,更新该值
 9 function random()
10 {
11     min=$1;
12     max=$2-$1;
13     num=$(date +%s+%N);
14     ((retnum=num%max+min));
15     #进行求余数运算即可
16     echo $retnum;
17     #这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
18     #还有一种返回,定义全价变量,然后函数改下内容,外面读取
19 }
20
21 #得到1-10的seq数据项
22 for i in {1..10};
23 do
24     out=$(random 2 10000);
25     echo $i,"2-10000",$out;
26 done;

看看运行结果:

[[email protected]  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

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

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

2、通过内部系统变量($RANDOM)

其实,linux已经提供有个系统环境变量了,直接就是随机数,哈哈,觉得刚学习方法,是不是白费了!!

1 [[email protected]  shell]$ echo $RANDOM
2 10918
3 [[email protected]  shell]$ echo $RANDOM
4 10001
5
6 #连续2次访问,结果不一样,这个数据是一个小于或等于5位的整数

可能有疑问了,如果超过5位的随机数怎么得到呢?

呵呵,加个固定10位整数,然后进行求余,跟例1 一样了。接下来的例子又是我们自立更生做了。

3、通过系统内部唯一数据生成随机数(/dev/random,urandom)

我们知道dev目录下面,是linux一些默认设备,它给我们感觉就是放的是键盘,硬盘,光驱等设备的对应文件了。 其实linux有些设备很特殊,有特殊用途。前面我们说到的:/dev/[udp|tcp]/host/port比较特殊吧。呵呵,有扯远了。

/dev/random设备,存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候,唯一值数据,因此可以用作随机数元数据。我们可以通过文件读取方式,读得里面数据。/dev/urandom这个设备数据与random里面一样。只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞。

实例:

 1 [[email protected]  shell]$ head -1 /dev/urandom
 2 ãņù…•KTþçanVÕã¹Û&¡õ¾“ô2íùU“ ?F¦_ ÿ”†mEðûUráÏ=J¯TŸA•ÌAÚRtÓ
 3
 4 #读一行,怎么是乱码呢?其实它是通过二进制数据保存实时数据的,那么我们怎么样把它变成整型数据呢?
 5
 6
 7 [[email protected] ~/shell]$ head -200 /dev/urandom | cksum
 8 1615228479 50333
 9 #由于urandom的数据是非常多,不能直接通过cat读取,这里取前200行,其实整个数据都是变化的,取多少也一样是唯一的。
10 #cksum 将读取文件内容,生成唯一的表示整型数据,只有文件内容不变,生成结果就不会变化,与php crc函数
11
12 [[email protected]  shell]$ head -200 /dev/urandom | cksum | cut -f1 -d" "
13 484750180
14 #cut 以” “分割,然后得到分割的第一个字段数据

得到整型数据,然后,类似一的方法就可以获得到随机数了。 题外话:在程序里面,我们经常md5得到唯一值,然后是字符串的,如果想表示成整型方式,可以通过crc函数.crc是循环冗余校验,相同数据通过运算,都会得到一串整型数据。现在这种验证应用很广。详细要了解,可以参考:crc.

下面还有个方法,直接从设备读取生成好的uuid码。

4、读取linux 的uuid码

在提到这个之前,有个概念,就是什么是uuid呢?

UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),它 是一个软件建构的标准,亦为自由软件基金会(Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。

UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。它会让网络任何一台计算机所生成的uuid码,都是互联网整个服务器网络中唯一的。它的原信息会加入硬件,时间,机器当前运行信息等等。

UUID格式是:包含32个16进位数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。范例;550e8400-e29b-41d4-a716-446655440000  ,所以:UUID理论上的总数为216 x 8=2128,约等于3.4 x 1038。 也就是说若每奈秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

其实,大家做数据库设计时候,肯定听说过,guid(全局唯一标识符)码,它其实是与uuid类似,由微软支持。 这里编码,基本有操作系统内核产生。大家记得把,在windows里面,无论数据库,还是其它软件,很容易得到这个uuid编码。

linux 的uuid码

linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内。其实,random目录,里面还有很多其它文件,都与生成uuid有关系的。

1 [[email protected] ~/shell]$ cat /proc/sys/kernel/random/uuid
2 dff68213-b700-4947-87b1-d9e640334196
3 [[email protected] ~/shell]$ cat /proc/sys/kernel/random/uuid
4 7b57209a-d285-4fd0-88b4-9d3162d2e1bc
5 #连续2次读取,得到的uuid是不同的
6
7 [[email protected] ~/shell]$ cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" "
8 2141807556
9 #同上方法得到随机整数

这是linux下面,几种常见活动随机数整数方法,除了第一个是不同外,其实后3个,产生随机码的伪数据来源,都与/dev/random设备有关系。只是它们各自呈现不同而已。如果你还有更多其它方法,请给我消息,与大家分享了。

时间: 2024-10-25 19:18:01

linux shell实现随机数多种方法(date,random,uuid)的相关文章

【转】linux shell实现随机数多种方法(date,random,uuid)

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

Linux Shell 生成随机数和随机字符串

日常生活中,会经常用到随机数,使用场景非常广泛,例如买彩票.丢骰子.抽签.年会抽奖等. Shell 下如何生成随机数呢,米扑博客特意写了本文,总结 Linux Shell 产生随机数的多种方法. 本文原文转自米扑博客:Linux Shell 生成随机数和随机字符串 计算机产生的的只是"伪随机数",不会产生绝对的随机数(是一种理想随机数).实际上,伪随机数和理想随机数也是相对的概念,例如伪随机数在1万万亿亿亿年内也无法重复,算是理想随机数么? 伪随机数在大量重现时也并不一定保持唯一,但一

linux shell if语句使用方法 [转载]

最精简的 if 命令的语法是: if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi TEST-COMMAND 执行后且它的返回状态是0,那么 CONSEQUENT-COMMANDS 就执行.返回状态是最后一个命令的退出状态,或者当没有条件是真的话为0. TEST-COMMAND 经常包括数字和字符串的比较测试,但是也可以是任何在成功时返回状态0或者失败时返回一些其他状态的一些命令.一元表达式经常用于检查文件的状态.如果对某个要素primaries, FI

shell生成随机数的方法

方法1:使用/dev/urandom [[email protected] shell]# tr -dc "0-9" < /dev/urandom | head -c 10        #生成10个数字 5798734885[[email protected] shell]#  [[email protected] shell]#  [[email protected] shell]# tr -dc "a-z" < /dev/urandom | hea

linux shell if语句使用方法

原文地址:http://blog.chinaunix.net/uid-24607609-id-2118151.html 最精简的 if 命令的语法是: if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi TEST-COMMAND 执行后且它的返回状态是0,那么 CONSEQUENT-COMMANDS 就执行.返回状态是最后一个命令的退出状态,或者当没有条件是真的话为0. TEST-COMMAND 经常包括数字和字符串的比较测试,但是也可以是任何在成功时返

linux截取字符串的多种方法

Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.hao.com/123.htm . . 一 # 号截取,删除左边字符,保留右边字符. echo ${var#*//} 其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符 即删除 http:// 结果是 :www.hao.com/123.htm    . . 二 ## 号截取,删除左边字符,保留右边字符. echo ${var##*/} ##*/ 表示从左边开始删

Linux shell get random number

the Shell Profile: When a new interactive shell is started, /etc/profile, followed by /etc/bash.bashrc(if a bash shell), ~/.profile, and finally ~/.bashrc are executed in that order. PATH You can set your PATHenvironment variable to tell the shell wh

C#中获取随机数有三种方法

随机数的定义为:产生的所有数字毫无关系. 在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号. 在C#中获取随机数有三种方法: 一.Random 类 Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数. 1 2 Random rd = new Random(); int i = rd.Next(); 这种随机数可以达到一些要求较低的目标,但是如果在高并发的情况下,Random类所取到的系统时钟种子接近甚至完全一样,就很有可能出现重复,这里用

shell 产生随机数的多种方法

总结: 1.echo $RANDOM 2. openssl rand -base64 10 3.date +%s%N   或 date +%s%N |md5sum 4.cat /proc/sys/kernel/random/uuid 5.使用yum安装expect 使用命令: mkpasswd -l 10 #-l为长度 后续再补充.