awk

Random Number Generator

Awk rand() Function

rand()被用于生成0和1之间一个随机数。它永远不会返回0或1,通常是0和1之间的一个值。数字是awk运行中随机的,但是每次运行可预见的。

awk使用一种算法来生成随机数,并且由于这个算法是固定的,所以这些数字是可重复的。

下面例子生成介于0和100之间1000随机数,并显示每个数是如何产生的。

Generate 1000 random numbers (between 0 and 100):
$ cat rand.awk
BEGIN {
    while(i < 1000) {
        n = int(rand()*100);
        rnd[n]++;
        i++;
    }
    for (i = 0; i<=100; i++) {
        print i, "Occured", rnd[i], "times";
    }
}

$ awk -f rand.awk
0 Occured 11 times
1 Occured 8 times
2 Occured 9 times
3 Occured 15 times
……
99 Occured 11 times
100 Occured  times

从上面的输出中,我们可以看到rand()函数可以生成重复数字非常频繁。

Awk srand(n) Function

srand(n)用给定参数n来初始化随机数产生。无论何时开始执行程序,awk从n开始生成它的随机数,如果没有给定参数,a将使用一天中的时间来生成。

Generate 5 random numbers starting from 5 to 50:
$ cat srand.awk
BEGIN {
    # Initialize the seed with 5.
    srand(5);
    # Totally I want to generate 5 numbers.
    total=5;
    # maximum number is 50.
    max=50;
    count=0;
    while(count < total) {
        rnd = int(rand() * max);
        if ( array[rnd] == 0 ) {
            count++;
            array[rnd]++;
        }
    }
    for ( i=5; i<=max; i++) {
        if ( array[i] )
        print i;
    }
}

$ awk -f srand.awk
14
16
23
33
35

上述srand.awk完成下面操作:

1. 使用rand()函数生成一个随机数乘以最大期望值产生一个数<50

2. 检查生成的随机数是不是已经存在于数组中。如果它不存在,它增加索引和循环计算,它使用这个逻辑生成5个数。

3. 最终在for循环里,它从最小到最大循环,并打印每一个索引包含的任何值。