awk之随机函数rand()和srand() (转)

转自:http://blog.chinaunix.net/uid-10540984-id-2942041.html

文件:

1234567

abcdefg

......

现在想要随机抽取5列组成下面的内容,允许重复:

36612

cffab

......

  1. awk -F ‘‘ ‘BEGIN{srand();for(i=1;i<=5;i++)a[i]=int(rand()*100%7+1)}{for(i=1;i<=5;i++)printf $a[i];printf RS}‘ file

[解析]

思路是首先把FS设置为空,随机抽取5列,那么在BEGIN模块定义数组a中1~5的下标对应随机的1~7的值,在读行时把数组a的值(这是个1~7的随机值)作为字段打印出来,这样就实现了随机抽取7个字段中的5个字段重新组成新的行。

rand()函数是随机产生一个0到1之间的保留小数点后6位的小数值,例如0.217788,所以需要乘以100得到21.7788,然后再对7取余,结果是0.7788,int()取整是0了,我们要获得1~7的随机数,所以加1,整个表达式才是 int(rand()*100%7+1) ,其实 int(length*rand()+1) 也是可以得到1~7的随机数的,只是在BEGIN中,length函数还是为0,这样就得到了肯定产生于1~7之间的随机数,问题在于rand()只产生一次,怎么让它滚动起来呢?这里我们还需要srand()函数,括号内没有表达式的话,它会采用当前时间作为随机计数器的种子,这样以秒为间隔,随机数

计数器的种子,这样以秒为间隔,随机数就能滚动随机生成了。最后再对应数组a的随机值作为字段打印出来。

  1. #!/bin/bash
  2. len="5"
  3. while read line; do
  4. str=""
  5. while [ "${#str}" -lt "$len" ]; do
  6. letter="${line:$(($RANDOM%${#line})):1}"
  7. str="$str$letter"
  8. done
  9. echo $str
  10. done < file

[解析]

同样,这个shell脚本也能实现该功能,首先定义变量 len=5 ,因为只需要5列嘛。然后从file文件中读入一行内容给变量 line ,定义一个长度为0的变量 str ,当 str 变量长度大于等于5了,就不再会继续whlie循环,然后打印该变量,在bash中 ${#var} 就是获取变量的长度,我们再看看怎么实现的随机,该shell的原理是读取 line 变量的随机0~6位置长度为1的字符,环境变量RANDOM,范围是0~32767,RANDOM对7取余的结果是0~6,就能随机抽取长度为7的字符串中的任意一个字符,然后把该字符累计给变量 str ,满足长度5后就打印出该行。

谢谢Tim和shell_HAT的精彩代码。

时间: 2024-10-24 04:41:30

awk之随机函数rand()和srand() (转)的相关文章

认识随机函数rand()和srand(unsigned int )

随机函数rand /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) / / Author: Nicolas Hery - http://nicolashery.com / / Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff / / Source: https://github.com/nicolahery/markdownpad-github */ /* RESET ==

C++ 中随机函数 rand() 和 srand() 的用法

C++教程这篇文章给大家讲述的是:C++ 中随机函数 rand() 和 srand() 的用法! 一.rand() 函数名: rand 功 能: 随机数发生器 用 法: int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned in

随机函数rand()和srand()

C++中随机函数rand()和srand()的用法 一.rand() 函数名:   rand     功   能:   随机数发生器   用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定 的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned int 双字节是

C++中随机函数rand()和srand()的用法

一.rand() 函数名:   rand 功   能:   随机数发生器 用   法:   int rand(void); 所在头文件: stdlib.h 函数说明 : rand()的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定 的范围里可看成是随机的. rand()返回一随机数值的范围在0至RAND_MAX 间.RAND_MAX的范围最少是在32767之间(int).用 unsigned int 双字节是65535,四字节是4294967295的整数范围.0~RAND

【转】随机函数的rand、srand用法

from:深海的小鱼儿 地址:http://www.cnblogs.com/xmphoenix/archive/2011/04/07/2008622.html 随机函数的rand.srand用法 一>基础 我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是 根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正 的随机数,当计算机正常开机后,这个种子的值是定了的,除

随机函数rand()算法

今天学习了一下随机函数rand的算法. 这个算法叫做线性同余算法(linear congruential generator (LCG)). 不同的编译器取的常数不同,可以参考wiki:http://en.wikipedia.org/wiki/Linear_congruential_generator 以下程序可以输出和系统一样的随机数. 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 #define _A 214013LL 6 #

rand()和srand()的用法

1.头文件包含cstdlib和ctime; 2.rand()是产生随机数0-32767: 3.rand()在编译后每次运行都产生相同的随机序列: 3.srand()用于初始化随机种子,当种子不一样时随机序列不一样,因为time(0)的每秒时间都不同故一般用他作为种子: 例如 #include<iostream>#include<cstdlib>#include<ctime>using namespace std;int main(){    int i;    sran

有关rand(),srand()产生随机数学习总结

看到夏雪冬日的有关rand()和srand()产生随机数的总结,挺好的,学习了,然后又有百度其他人的成果,系统总结一下.本文转自夏雪冬日:http://www.cnblogs.com/heyonggang/archive/2012/12/12/2814271.html,Peng Lv:http://www.cnblogs.com/lvpengms/archive/2010/02/03/1663066.html#commentform. 要计算机产生一个随机数不像扔色子一样,计算机的每一步操作,就

rand()和srand()GetTickCount函数用法

标准库<cstdlib>(被包含于<iostream>中)提供两个帮助生成伪随机数的函数: 函数一:int rand(void):从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数. 函数二:void srand(unsigned seed):参数seed是rand()的种子,用来初始化rand()的起始值. 可以认为rand()在每次被调用的时候,它会查看:1) 如果用户在此之前调用过srand(seed),给se