awk学习笔记(15) - 数学函数及随机数

简介:

awk中的数学函数如下表:

函数名 说明
atan2( y, x ) 返回 y/x 的反正切。
cos( x ) 返回 x 的余弦;x 是弧度。
sin( x ) 返回 x 的正弦;x 是弧度。
exp( x ) 返回 x 幂函数。
log( x ) 返回 x 的自然对数。
sqrt( x ) 返回 x 平方根。
int( x ) 返回 x 的截断至整数的值。
rand( ) 返回任意数字 n,其中 0 <= n < 1。
srand( [Expr] ) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值。

测试程序1

为了测试多个数学函数,编写了测试程序文件math.awk:

 
 
  1. BEGIN{ 
  2.     OFMT="%.3f"
  3.     rs[0]=atan2(5,2); 
  4.     rs[1]=cos(2); 
  5.     rs[2]=sin(1);   
  6.     rs[3]=exp(10);     
  7.     rs[4]=log(10); 
  8.     rs[5]=sqrt(16); 
  9.     rs[6]=int(3.1415); 
  10.     len = length(rs); 
  11.     for(i=0; i<len; i++) 
  12.     { 
  13.         print rs[i]; 
  14.     } 

输出结果:

 
 
  1. 1.190 
  2. -0.416 
  3. 0.841 
  4. 22026.466 
  5. 2.303 

测试程序2

下面用简单的命令行程序来测试一下awk的随机数:

 
 
  1. awk 'BEGIN{print rand()}' 

上面的程序试图调用rand函数产生一个随机数,实际的结果如下:

 
 
  1. 0.840188 

反复执行多遍也是这个结果。

要想在awk中产生随机数,需要如下编写:

 
 
  1. awk 'BEGIN{srand();print rand()}' 

执行两遍看下结果:

 
 
  1. 0.638082 
  2. 0.349 

在awk中,需要先调用srand函数产生随机种子,再调用rand来产生随机数。srand默认是用时间来做种子。

很不幸的是,awk的随机函数随机性并不好,只能做简单的应用。为什么这么说?上面的代码如果在很短的时间间隔里执行,会产生相同的随机数。

是否可以产生随机性更好的随机数呢?srand不是有个可选的参数么?好吧,我们来试试。首先我们先试下php中的微秒函数microtime,它可以获得微秒级的时间。用它来做为随机种子应该OK吧。于是,写了下面的代码:

 
 
  1. php -r "echo microtime(true);"|awk '{srand($0);print rand()}' 

效果如何呢?在很1秒钟之内多次执行时仍然会产生多个相同的随机数,可见,即使指定了随机种子也不能保证其足够的随机。可以对比一下php的随机函数mt_rand,看看它的效果如何:

 
 
  1. php -r "echo mt_rand(100000000, 999999999);"|awk '{print}' 

在很短的时间内执行多次产生的随机数没有相同的,这明显要比awk的效果要好。

目前为止,还没有找到用纯的awk函数能产生随机性较好的随机数的办法。或许这是mac os的问题,有空会在别的linux系统试一下。










本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1045231,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
C语言 C++
【C语言】rand()函数(如何生成指定范围随机数)
【C语言】rand()函数(如何生成指定范围随机数)
17 0
|
2月前
Verilog基础:$random系统函数的使用
Verilog基础:$random系统函数的使用
46 0
|
2月前
|
存储 编译器 C语言
c语言随机数生成(rand,srand,time)
c语言随机数生成(rand,srand,time)
|
4月前
如何用rand产生随机数
如何用rand产生随机数
25 2
|
9月前
|
C语言
C语言生成随机数(rand函数)
C语言生成随机数(rand函数)
637 0
|
9月前
随机数,函数
1.随机一个1-10之间的小数
53 0
|
编译器 C语言 C++
C++中rand随机数的用法
C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
|
Python
Python如何生成随机数——random随机数模块的应用
在python中用于生成随机数的模块是random,在使用前需要import。
228 0
|
开发者 Python
使用内置函数实现进制转化 | 学习笔记
快速学习 使用内置函数实现进制转化
37 0
|
前端开发 开发者
less-内置函数和运算 |学习笔记
快速学习 less-内置函数和运算
72 0