Chinaunix

标题: 如何用shell实现“洗牌”效果? [打印本页]

作者: 大红机器    时间: 2004-04-19 15:10
标题: 如何用shell实现“洗牌”效果?
比如一文件里为
1
2
3
4
5
如何使每次显示顺序都不同?
C语言的话用指针很简单,用shell的话方法也不是没有,但是速度是很大问题。
还请各位高手帮忙
作者: forest077    时间: 2004-04-19 15:20
标题: 如何用shell实现“洗牌”效果?
你是想要随机的效果吗?
作者: 大红机器    时间: 2004-04-19 15:22
标题: 如何用shell实现“洗牌”效果?
洗牌嘛,当然是随机效果咯
作者: 網中人    时间: 2004-04-19 15:43
标题: 如何用shell实现“洗牌”效果?
我記得之前有討論過,當時我是用 $RAMDOM 除以總行數再取餘數來重排的...
不過我忘了貼子在哪裡了...
作者: 大红机器    时间: 2004-04-19 15:49
标题: 如何用shell实现“洗牌”效果?
原帖由 "網中人" 发表:
我記得之前有討論過,當時我是用 $RAMDOM 除以總行數再取餘數來重排的...
不過我忘了貼子在哪裡了...

不太明白,这样的话会不会出现一行被显示多次的情况呢?还请老大详细说说
作者: r2007    时间: 2004-04-19 15:50
标题: 如何用shell实现“洗牌”效果?
有一个巧方法,机器兄可以试试
  1. while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1
复制代码

作者: 網中人    时间: 2004-04-19 15:57
标题: 如何用shell实现“洗牌”效果?
r2007 兄的方法很妙﹗  ^_^
作者: 大红机器    时间: 2004-04-19 16:02
标题: 如何用shell实现“洗牌”效果?
[quote]原帖由 "r2007"]while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1[/quote 发表:

看傻了,呵呵
作者: admirer    时间: 2004-04-19 16:48
标题: 如何用shell实现“洗牌”效果?
[quote]原帖由 "r2007"][/quote 发表:

妙啊!
作者: labrun    时间: 2004-04-19 17:07
标题: 如何用shell实现“洗牌”效果?
用awk中的rand()怎么每次都一样?
比如awk 'BEGIN{print rand()}'
作者: nkoldbug    时间: 2004-04-19 17:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: labrun    时间: 2004-04-19 17:37
标题: 如何用shell实现“洗牌”效果?
一样,所以我想r2007也是因为如此而不用awk。
nkoldbug你的sco每次都不同么?
作者: nkoldbug    时间: 2004-04-19 18:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: forest077    时间: 2004-04-19 20:47
标题: 如何用shell实现“洗牌”效果?
要用awk产生随机数,先要种随机种子!

  1. awk 'BEGIN{srand()}{print rand()}'
复制代码

诸位可以试试,这样就随机了。
作者: @龙井茶    时间: 2004-04-19 21:07
标题: 如何用shell实现“洗牌”效果?
好像awk的rand()的值每次都一样的,那还叫什么随机数,
shell中echo $RANDOM 是不一样的,不知道为什么会这样?
想不出什么招比r2007的方法更好了
作者: admirer    时间: 2004-04-19 21:14
标题: 如何用shell实现“洗牌”效果?
原帖由 "labrun" 发表:
一样,所以我想r2007也是因为如此而不用awk。
nkoldbug你的sco每次都不同么?

当然是一样的,这是由awk的特性决定的:
rand()      得出一个乱数值。此乱数值平均分布在 0 和 1 之间。这个
           值不会是 0,也不会是 1。                                   
           每次执行 gawk,rand 开始产生数字从相同点或 seed。
srand(x)    设定产生乱数的开始点或seed为x。如果在第二次你设           
           定相同的 seed 值,你将再度得到相同序列的乱数值。
           如果省略引数 x,例如 srand(),则现在的日期、时间会   
           被当成 seed。这个方法可使得乱数值是真正不可预测的。     
           srand 的传回值(return value)是前次所设定的 seed 值。

所以要想让awk每次产生不同的随机数起始值,必须要用srand()进行初始设置。
  1. awk 'BEGIN{srand()}{print rand()}'
复制代码

作者: 光明晓仙    时间: 2004-04-20 00:33
标题: 如何用shell实现“洗牌”效果?
while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1


没看懂...................
作者: xyb    时间: 2004-04-20 10:13
标题: 如何用shell实现“洗牌”效果?
洗牌的shell实现可以到网上去找,但这里用不着洗牌,反正你只取其中“一张”而已:
f=a.txt; sed -n $((RANDOM%`cat $f|wc -l`+1)){p\;q} $f
这个比上面用awk的效率会稍好一点,一个是她只需要生成一个随机数,而不是每行对应一个; 另一个是用sed可以在取到需要的行后及时退出,省掉了机器费力去读取后面的内容。
作者: forest077    时间: 2004-04-20 11:23
标题: 如何用shell实现“洗牌”效果?
原帖由 "光明晓仙" 发表:

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

这个算法为每张牌产生一个随机数,然后根据这些随机数为每张牌排序,因为是随机数,所以排序以后牌的旧顺序就被打乱了,这时再把牌打印出来,就是随机顺序。
作者: telephone    时间: 2004-04-20 11:40
标题: 如何用shell实现“洗牌”效果?
原帖由 "@龙井茶" 发表:
好像awk的rand()的值每次都一样的,那还叫什么随机数,
shell中echo $RANDOM 是不一样的,不知道为什么会这样?
想不出什么招比r2007的方法更好了

forest077兄说的已经很清楚了,用srand函数产生随机种子,这样,rand每次就不同了
作者: xyb    时间: 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前面都要加$符号,大家不要忘了。
作者: 大红机器    时间: 2004-04-20 14:09
标题: 如何用shell实现“洗牌”效果?
[quote]原帖由 "xyb"]洗牌的shell实现可以到网上去找,但这里用不着洗牌,反正你只取其中“一张”而已:[/quote 发表:

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

作者: bjgirl    时间: 2004-04-20 16:17
标题: 如何用shell实现“洗牌”效果?
原帖由 "@龙井茶" 发表:
好像awk的rand()的值每次都一样的,那还叫什么随机数,
shell中echo $RANDOM 是不一样的,不知道为什么会这样?
想不出什么招比r2007的方法更好了
对的,
作者: xyb    时间: 2004-04-21 09:17
标题: 如何用shell实现“洗牌”效果?
[quote]原帖由 "大红机器"][/quote 发表:

哦,是我搞错了,对不起啦  
作者: jashy    时间: 2006-07-03 12:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: yjh777    时间: 2006-07-05 10:32
原帖由 光明晓仙 于 2004-4-20 00:33 发表
while read i;do echo "$i $RANDOM";done<file|sort -k2n|cut -d" " -f1


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


作了一个随机数的索引,然后排序,被索引的内容自然就跟着随机了..




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2