洗牌问题:

    洗一副扑克,有什么好办法?既能洗得均匀,又能洗得快?即相对于一个文件来说怎样
高效率的实现乱序排列? 关于洗牌问题,其实已经有了一个很好的shell解法,这里另外给三个基于AWK的方法,
有错误之处还请不吝指出。 方法一穷举:
类似于穷举法,构造一个散列来记录已经打印行出现行的次数,如果出现次数多于一
次则不进行处理,这样可以防止重复,但缺点是加大了系统的开销。 awk -v N=`sed -n '$=' data` '
BEGIN{
FS="\n";
RS=""
}
{
srand();
while(t!=N){
x=int(N*rand()+);
a[x]++;
if(a[x]==)
{
print $x;t++
}
}
}
' data 方法二变换:
基于数组下标变换的办法,即用数组储存每行的内容,通过数组下标的变换
交换数组的内容,效率好于方法一。 #! /usr/awk BEGIN{
srand();
} {
b[NR]=$;
} END{ C(b,NR);
for(x in b)
{
print b[x];
} } function C(arr,len,i,j,t,x){ for(x in arr)
{
i=int(len*rand())+;
j=int(len*rand())+;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
} } 方法三散列: 三个方法中最好的。
利用AWK中散列的特性(详细请看:info gawk 中的7.x ),只要构造一个
随机不重复的散列函数即可,因为一个文件每行的linenumber是独一无二的,所
以用: 随机数+每行linenumber ------对应------> 那一行的内容 即为所构造的随机函数。
从而有: awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data 其实大家担心的使用内存过大的问题不必太在意,可以做一个测试: 测试环境:
PM .4GHz CPU,40G硬盘,内存256M的LAPTOP
SUSE 9.3 GNU bash version 3.00. GNU Awk 3.1. 产生一个五十几万行的随机文件,大约有38M: od /dev/urandom |dd count= >data 拿效率较低的方法一来说: 洗牌一次所用时间: time awk -v N=`sed -n '$=' data` '
BEGIN{
FS="\n";
RS=""
}
{
srand();
while(t!=N){
x=int(N*rand()+);
a[x]++;
if(a[x]==)
{
print $x;t++
}
}
}
' data 结果(文件内容省略): real 3m41.864s
user 0m34.224s
sys 0m2.102s 所以效率还是勉强可以接受的。 方法二的测试: time awk -f awkfile datafile 结果(文件内容省略): real 2m26.487s
user 0m7.044s
sys 0m1.371s 效率明显好于第一个。 接着考察一下方法三的效率: time awk 'BEGIN{srand()}{b[rand()NR]=$0}END{for(x in b)print b[x]}' data 结果(文件内容省略): real 0m49.195s
user 0m5.318s
sys 0m1.301s 对于一个38M的文件来说已经相当不错了。
玩的愉快!

shell实现洗牌随机的更多相关文章

  1. 对数组排序进行"洗牌"(随机排序)

    这段代码在这里使用Fisher Yates洗牌算法给一个指定的数组进行洗牌(随机排序). function shuffle(arr) {     var i,        j,        tem ...

  2. Shell脚本实现乱序排列文件内容的多种方法(洗牌问题)

    洗牌问题:洗一副扑克,有什么好办法?既能洗得均匀,又能洗得快?即相对于一个文件来说怎样高效率的实现乱序排列? ChinaUnix 确实是 Shell 高手云集的地方,只要你想得到的问题,到那里基本上都 ...

  3. Hard 随机洗牌函数 @CareerCup

    第i个元素和index在[i,length-1]之间的一个数随机交换 package Hard; import CtCILibrary.AssortedMethods; /** * * Write a ...

  4. Craking the coding interview 面试题:完美随机洗牌

    给定一个序列,随机打乱这个序列,新产生的序列和任意一个序列产生的可能性是一样的,就是所谓的完美随机洗牌. 看下面的运行结果: 上面第一列是原数列,下面一行是新产生的打乱的数列. 基本思想:如果n-1个 ...

  5. 随机洗牌算法Knuth Shuffle和错排公式

    Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码 ...

  6. 实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)

    实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例) 1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtup ...

  7. random array & shuffle 洗牌算法 / 随机算法

    random array & shuffle shuffle 洗牌算法 / 随机算法 https://en.wikipedia.org/wiki/Fisher–Yates_shuffle ES ...

  8. VB洗牌算法产生随机数组

    算法图示: 运行效果: 详细代码: Option Explicit '洗16张牌(0-15),方便用十六进制显示 Dim Card() As Long Private Sub 洗牌() Dim i&a ...

  9. 如何随机排序数组?使用多种方式!递归,迭代,洗牌,sort方法!

    方式1: 使用sort 方法 ---- // 方法1 使用sort 方法 var arr = [1,2,3,4,5,6,7,8]; function foo(arr) { var cloneArr = ...

随机推荐

  1. [Contest20180311]朋友

    是毒瘤的friends呢~ 注意到“产生感情”和后缀自动机的$Right$集合定义很像,所以先对所有串建广义sam,那么一个节点$s$里的所有串都互相产生感情,而从起点走到$s$走最长路所经过的节点里 ...

  2. 【树状数组】Codeforces Round #755 D. PolandBall and Polygon

    http://codeforces.com/problemset/problem/755/D 每次新画一条对角线的时候,考虑其跨越了几条原有的对角线. 可以用树状数组区间修改点查询来维护多边形的顶点. ...

  3. 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值

    显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...

  4. python 爬取36K新闻

    代码如下: from urllib import request url = 'http://36kr.com/api/info-flow/newsflash_columns/newsflashes? ...

  5. iOS9 HTTPS解决办法

    iOS9引入了新特性App Transport Security (ATS).详情:App Transport Security (ATS) 新特性要求App内访问的网络必须使用HTTPS协议.但是现 ...

  6. linux下分区相关知识

    Linux 规定了主分区(或者扩展分区)占用 1 至 16 号码中的前 4 个号码.以第一个 IDE 硬盘为例说明,主分区(或者扩展分区)占用了 hda1.hda2.hda3.hda4,而逻辑分区占用 ...

  7. Oracle审计--AUD$占用空间较大处理方案

    Oracle 11G以后,数据库默认是开启审计功能的,因此有时候我们忘记了关闭该功能导致SYSTEM表空间暴满,但由于关闭审计功能需要重启数据库,此类操作生产环境下是不允许的,因此我们需要找出哪类审计 ...

  8. C# 7 新特性-1

    来源https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/ Tuples What Tuples是数据的临时分组.区 ...

  9. nginx+php-fpm页面显示空白的解决方法

    在nginx与php的环境中,配置了一个wordpress,访问时发现php的页面一直显示空白,起初以为是权限问题,将权限改成755后还是不行.   然后,开启nginx和php的日志,但在日志里也没 ...

  10. Build a Restful Service

    最近项目中遇到的REST的问题很多,很多情况下受weblogic以及Jdeveloper版本的影响,无法直接从Jdeveloper中生成一个RESTful Service出来,所以基于流行的Sprin ...