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系统试一下。