rand()被用于生成0和1之间一个随机数。它永远不会返回0或1,通常是0和1之间的一个值。数字是awk运行中随机的,但是每次运行可预见的。
awk使用一种算法来生成随机数,并且由于这个算法是固定的,所以这些数字是可重复的。
下面例子生成介于0和100之间1000随机数,并显示每个数是如何产生的。
$ 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()函数可以生成重复数字非常频繁。
srand(n)用给定参数n来初始化随机数产生。无论何时开始执行程序,awk从n开始生成它的随机数,如果没有给定参数,a将使用一天中的时间来生成。
$ 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循环里,它从最小到最大循环,并打印每一个索引包含的任何值。