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:
- BEGIN{
- OFMT="%.3f";
- rs[0]=atan2(5,2);
- rs[1]=cos(2);
- rs[2]=sin(1);
- rs[3]=exp(10);
- rs[4]=log(10);
- rs[5]=sqrt(16);
- rs[6]=int(3.1415);
- len = length(rs);
- for(i=0; i<len; i++)
- {
- print rs[i];
- }
- }
输出结果:
- 1.190
- -0.416
- 0.841
- 22026.466
- 2.303
- 4
- 3
测试程序2
下面用简单的命令行程序来测试一下awk的随机数:
- awk 'BEGIN{print rand()}'
上面的程序试图调用rand函数产生一个随机数,实际的结果如下:
- 0.840188
反复执行多遍也是这个结果。
要想在awk中产生随机数,需要如下编写:
- awk 'BEGIN{srand();print rand()}'
执行两遍看下结果:
- 0.638082
- 0.349
在awk中,需要先调用srand函数产生随机种子,再调用rand来产生随机数。srand默认是用时间来做种子。
很不幸的是,awk的随机函数随机性并不好,只能做简单的应用。为什么这么说?上面的代码如果在很短的时间间隔里执行,会产生相同的随机数。
是否可以产生随机性更好的随机数呢?srand不是有个可选的参数么?好吧,我们来试试。首先我们先试下php中的微秒函数microtime,它可以获得微秒级的时间。用它来做为随机种子应该OK吧。于是,写了下面的代码:
- php -r "echo microtime(true);"|awk '{srand($0);print rand()}'
效果如何呢?在很1秒钟之内多次执行时仍然会产生多个相同的随机数,可见,即使指定了随机种子也不能保证其足够的随机。可以对比一下php的随机函数mt_rand,看看它的效果如何:
- php -r "echo mt_rand(100000000, 999999999);"|awk '{print}'
在很短的时间内执行多次产生的随机数没有相同的,这明显要比awk的效果要好。
目前为止,还没有找到用纯的awk函数能产生随机性较好的随机数的办法。或许这是mac os的问题,有空会在别的linux系统试一下。
本文转自 ustb80 51CTO博客,原文链接:http://blog.51cto.com/ustb80/1045231,如需转载请自行联系原作者