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,如需转载请自行联系原作者
目录
相关文章
|
Perl
在 `awk` 中,for 循环
在 `awk` 中,for 循环
930 5
|
数据可视化 Java uml
IDEA中一个被低估的功能,一键把项目代码绘制成UML类图
IDEA中一个被低估的功能,一键把项目代码绘制成UML类图
1158 1
|
自然语言处理 Java Go
Fury:一个基于JIT动态编译的高性能多语言原生序列化框架
Fury是一个基于JIT动态编译的多语言原生序列化框架,支持Java/Python/Golang/C++等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
Fury:一个基于JIT动态编译的高性能多语言原生序列化框架
github下载的.ipynb文件报错unreadable Notebook NotJSONError
【8月更文挑战第2天】文章提供了解决GitHub下载的Jupyter Notebook文件打开时报错的方法,包括端口冲突和文件加载错误。
397 0
github下载的.ipynb文件报错unreadable Notebook NotJSONError
RAID常见级别与JBOD概述
文章详细介绍了RAID技术的常见级别,包括RAID 0、RAID 1、RAID 4、RAID 5、RAID 6、RAID 7、RAID 10、RAID 01、RAID 50以及JBOD的概念、工作原理、优缺点和适用场景,同时探讨了RAID与JBOD的区别以及软件RAID的实现方法。
2168 1
RAID常见级别与JBOD概述
|
并行计算 大数据 数据处理
亿级数据处理,Pandas的高效策略
在大数据时代,数据量的爆炸性增长对处理技术提出更高要求。本文介绍如何利用Python的Pandas库及其配套工具高效处理亿级数据集,包括:采用Dask进行并行计算,分块读取以减少内存占用,利用数据库进行复杂查询,使用内存映射优化Pandas性能,以及借助PySpark实现分布式数据处理。通过这些方法,亿级数据处理变得简单高效,助力我们更好地挖掘数据价值。
594 1
|
前端开发 数据可视化 数据挖掘
现代布局方案在商品卡片中的应用实践
现代布局方案在商品卡片中的应用实践
359 2
|
C语言 索引 Perl
在awk中遍历数组
在awk中遍历数组
397 8
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的汉服交易小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的汉服交易小程序的详细设计和实现(源码+lw+部署文档+讲解等)
220 7
|
Go 开发者
如何使用 Golang 实现继承:详细指南
【8月更文挑战第31天】
1274 0