awk學習筆記(15)-數學函式及隨機數

餘二五發表於2017-11-22

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,如需轉載請自行聯絡原作者


相關文章