免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 12353 | 回复: 25
打印 上一主题 下一主题

如何用shell实现“洗牌”效果?  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-19 15:10 |只看该作者 |正序浏览
比如一文件里为
1
2
3
4
5
如何使每次显示顺序都不同?
C语言的话用指针很简单,用shell的话方法也不是没有,但是速度是很大问题。
还请各位高手帮忙

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
26 [报告]
发表于 2006-07-05 10:32 |只看该作者
原帖由 光明晓仙 于 2004-4-20 00:33 发表
while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1


没看懂...................


作了一个随机数的索引,然后排序,被索引的内容自然就跟着随机了..
jashy 该用户已被删除
25 [报告]
发表于 2006-07-03 12:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
24 [报告]
发表于 2004-04-21 09:17 |只看该作者

如何用shell实现“洗牌”效果?

[quote]原帖由 "大红机器"][/quote 发表:

哦,是我搞错了,对不起啦  

论坛徽章:
0
23 [报告]
发表于 2004-04-20 16:17 |只看该作者

如何用shell实现“洗牌”效果?

原帖由 "@龙井茶" 发表:
好像awk的rand()的值每次都一样的,那还叫什么随机数,
shell中echo $RANDOM 是不一样的,不知道为什么会这样?
想不出什么招比r2007的方法更好了
对的,

论坛徽章:
0
22 [报告]
发表于 2004-04-20 14:09 |只看该作者

如何用shell实现“洗牌”效果?

[quote]原帖由 "xyb"]洗牌的shell实现可以到网上去找,但这里用不着洗牌,反正你只取其中“一张”而已:[/quote 发表:

???我就是要洗牌啊!
取一张的话这样也可以吧:
  1. sed -n $(echo $RANDOM*$(cat file|wc -l)/32768|bc)p file
复制代码

论坛徽章:
0
21 [报告]
发表于 2004-04-20 13:54 |只看该作者

如何用shell实现“洗牌”效果?

  1. f=a.txt; sed -n $((RANDOM%`cat $f|wc -l`+1)){p\;q} $f
复制代码

刚意识到一个小问题,这条命令只在对付少于65536行的文件时才正确,请使用时注意。当然也可以扩展一下:
  1. f=a.txt; sed -n $((($RANDOM*65536 + $RANDOM)%`cat $f|wc -l`+1)){p\;q} $f
复制代码

这样可以对付65536*65536行了,大概一般情况足够了吧!?就是有点太长了。值得注意的是,这里的两个RANDOM前面都要加$符号,大家不要忘了。

论坛徽章:
0
20 [报告]
发表于 2004-04-20 11:40 |只看该作者

如何用shell实现“洗牌”效果?

原帖由 "@龙井茶" 发表:
好像awk的rand()的值每次都一样的,那还叫什么随机数,
shell中echo $RANDOM 是不一样的,不知道为什么会这样?
想不出什么招比r2007的方法更好了

forest077兄说的已经很清楚了,用srand函数产生随机种子,这样,rand每次就不同了

论坛徽章:
0
19 [报告]
发表于 2004-04-20 11:23 |只看该作者

如何用shell实现“洗牌”效果?

原帖由 "光明晓仙" 发表:

没看懂...................

这个算法为每张牌产生一个随机数,然后根据这些随机数为每张牌排序,因为是随机数,所以排序以后牌的旧顺序就被打乱了,这时再把牌打印出来,就是随机顺序。

论坛徽章:
0
18 [报告]
发表于 2004-04-20 10:13 |只看该作者

如何用shell实现“洗牌”效果?

洗牌的shell实现可以到网上去找,但这里用不着洗牌,反正你只取其中“一张”而已:
f=a.txt; sed -n $((RANDOM%`cat $f|wc -l`+1)){p\;q} $f
这个比上面用awk的效率会稍好一点,一个是她只需要生成一个随机数,而不是每行对应一个; 另一个是用sed可以在取到需要的行后及时退出,省掉了机器费力去读取后面的内容。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP