LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
精华主题  
主题工具
旧 03-12-26, 12:40 第 1 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

标题: 考考你:如何用shell产生随机数组


如:输入10,那么显示数组的所有元素,但是各个元素的排列是随机的( 3 0 9 7 4 2 1 8 5 6),而不是顺序排列( 0 1 2 3 4 5 6 7 8 9)!
  KornLee 当前离线   回复时引用此帖
旧 03-12-26, 15:40 第 2 帖
home
 
 
 
已封禁  
  注册日期: Nov 2003
  帖子: 1,150
  精华: 5
 

可做参考。
http://www.linuxsir.com/bbs/showthre...threadid=66426
  home 当前离线   回复时引用此帖
旧 03-12-26, 16:05 第 3 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 home 发表
可做参考。
http://www.linuxsir.com/bbs/showthre...threadid=66426
这个贴子只能产生随机数,我用的方法是先创建一个初始数组,比如10,那么数组A就有10个元素,再建一个空的数组,然后用RANDOM产生随机数跟数组A来比较,出现过的元素被送至数组B,数组A用grep -v的形式再重新赋值创建,当循环的次数大于$1的时候退出,最后再用export导出,也就是说真正的可以在命令行中用echo ${array[*]}回显出来~,目前难点是如果参数>=10的时候还得作些处理~,10以内的我作出来了,这是我做的,请指教
代码:
[/home/javalee/myshell]cat rand #!/bin/ksh # set -A newarray n=1 set -A array $(while ((n<=$1));do echo -n "$n " ((n+=1)) done) echo "old array: ${array[*]}" i=0 while do rand=$(echo $RANDOM|cut -b1) #???目前在努力... if echo ${array[*]}|tr ' ' '\n'|grep -q $rand ;then newarray[$i]=$rand set -A array $(echo -n ${array[*]}|tr ' ' '\n'|grep -v $rand|tr '\n' ' ') ((i+=1)) else continue fi export var=${newarray[*]} if [[ ${#newarray[*]} -eq $1 ]];then break fi done set -A _array $(echo $var) echo "new array:${_array[*]}" unset array rand i n newarray
测试:
引用:
[/home/javalee/myshell]typeset|grep _array #没有这个数组
[/home/javalee/myshell]. rand 9 # 必须用dot命令!才可以导出数组
old array: 1 2 3 4 5 6 7 8 9
new array:3 1 2 4 9 6 7 8 5
[/home/javalee/myshell]typeset |grep _array
typeset _array #数组_array已经导出
[/home/javalee/myshell]echo ${_array[*]} #显示数组所有元素
3 1 2 4 9 6 7 8 5
[/home/javalee/myshell]. rand 8
old array: 1 2 3 4 5 6 7 8
new array:3 1 2 5 7 4 8 6
  KornLee 当前离线   回复时引用此帖
旧 03-12-26, 18:09 第 4 帖
r2007
 
r2007 的头像
 
 
注册会员  
  注册日期: Jul 2003
  帖子: 166
  精华: 0
 

另外一个思路
r2007@www r2007 $ n=26
r2007@www r2007 $ a=($(for ((i=1;i<=$n;i++));do echo "$i $RANDOM";done|sort -k2n|cut -d" " -f1))
r2007@www r2007 $ echo ${a[*]}
17 4 26 19 2 5 16 21 22 20 11 6 23 8 25 24 12 7 13 14 1 3 18 15 10 9
r2007@www r2007 $
  r2007 当前离线   回复时引用此帖
旧 03-12-26, 18:57 第 5 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 r2007 发表
另外一个思路
r2007@www r2007 $ n=26
r2007@www r2007 $ a=($(for ((i=1;i<=$n;i++));do echo "$i $RANDOM";done|sort -k2n|cut -d" " -f1))
r2007@www r2007 $ echo ${a[*]}
17 4 26 19 2 5 16 21 22 20 11 6 23 8 25 24 12 7 13 14 1 3 18 15 10 9
r2007@www r2007 $
这个sort用得妙!,呵呵~~,看来我把问题想复杂啦~,我借用了perl 的rand()函数,结果效果还是不好~
  KornLee 当前离线   回复时引用此帖
旧 03-12-26, 21:29 第 6 帖
bouzouki
 
bouzouki 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: tj
  帖子: 397
  精华: 1
 

读 /dev/urandom 可以得到无符号的随机数
  bouzouki 当前离线   回复时引用此帖
旧 03-12-26, 22:01 第 7 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 bouzouki 发表
读 /dev/urandom 可以得到无符号的随机数
怎么读? 请指教
  KornLee 当前离线   回复时引用此帖
旧 03-12-27, 00:14 第 8 帖
bouzouki
 
bouzouki 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: tj
  帖子: 397
  精华: 1
 

比如要产生十个随机数(0~256):
head -c10 /dev/urandom | od -t u1 -A none
  bouzouki 当前离线   回复时引用此帖
旧 03-12-27, 00:20 第 9 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 bouzouki 发表
比如要产生十个随机数(0~256):
head -c10 /dev/urandom | od -t u1 -A none
bouzouki兄
那个-u1怎么解释呀~~,谢谢!

此帖于 03-12-27 00:23 被 KornLee 编辑.
  KornLee 当前离线   回复时引用此帖
旧 03-12-27, 00:43 第 10 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

哦,解释在这里
引用:
[/home/javalee/myshell]od --help
...
u[SIZE] unsigned decimal, SIZE bytes per integer
...
不过这样固然可以产生的随机数还是无法满足题目的要求呀,:(
I am try think~~~ :ask
  KornLee 当前离线   回复时引用此帖
旧 03-12-27, 18:57 第 11 帖
bouzouki
 
bouzouki 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: tj
  帖子: 397
  精华: 1
 

sorry,没仔细看题目,以为大家在讨论shell下产生随机数,
  bouzouki 当前离线   回复时引用此帖
旧 03-12-27, 19:14 第 12 帖
bouzouki
 
bouzouki 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: tj
  帖子: 397
  精华: 1
 

head -c10 /dev/urandom | od -t u1 -A d -w1|sort -k2|tail -n10|cut -f1 -d' '
就算基本上可以达到要求吧
  bouzouki 当前离线   回复时引用此帖
旧 03-12-28, 01:34 第 13 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 bouzouki 发表
head -c10 /dev/urandom | od -t u1 -A d -w1|sort -k2|tail -n10|cut -f1 -d' '
就算基本上可以达到要求吧
当然~~,可是我认为最牛的还是r2007兄的脚本
引用:

最初由 r2007 发表

另外一个思路
r2007@www r2007 $ n=26
r2007@www r2007 $ a=($(for ((i=1;i<=$n;i++));do echo "$i $RANDOM";done|sort -k2n|cut -d" " -f1))
r2007@www r2007 $ echo ${a[*]}
17 4 26 19 2 5 16 21 22 20 11 6 23 8 25 24 12 7 13 14 1 3 18 15 10 9
r2007@www r2007 $
我好歹也交卷吧~~,虽然脚本烂了些~~ :o
代码:
[/home/javalee/myshell]cat newrand #!/bin/ksh #创建随机数组 #要导出的环境,用dot命令 #脚本开始 #初始化空数组array. set -A array #初始化数组下标. i=0 #开始主循环. while true;do #产生随机数. rand=$(perl -e "print int rand($(($1+1)))") [[ $rand -eq 0 ]] && continue #向数组array中添加不重复的元素. if ! echo ${array[*]}|tr ' ' '\n'|grep -q "\<$rand\>";then array[$i]=$rand ((i+=1)) else continue fi #当数组array元素个数满足条件,跳出循环. ((${#array[*]}==$1)) && break done #导出数组. export var=${array[*]} set -A array $(echo $var);echo ${array[*]} #脚本结束,取消脚本中无用变量 unset i rand var
测试:
引用:
[/home/javalee/myshell]typeset|grep array
[/home/javalee/myshell]. newrand 50
33 37 19 2 14 12 25 21 43 34 47 13 30 40 26 50 32 15 23 41 18 28 49 44 27 38 45 48 8 5 24 4 11 46 16 1 17 42 29 6 10 39 3 22 9 20 31 35 7 36
[/home/javalee/myshell]typeset|grep array
typeset array
[/home/javalee/myshell]echo ${array[*]}
33 37 19 2 14 12 25 21 43 34 47 13 30 40 26 50 32 15 23 41 18 28 49 44 27 38 45 48 8 5 24 4 11 46 16 1
  KornLee 当前离线   回复时引用此帖
旧 03-12-28, 02:06 第 14 帖
KornLee
 
 
 
★☆★☆★☆★  
  注册日期: Nov 2002
  我的住址: LinuxWorld
  帖子: 6,960
  精华: 61
 

引用:
最初由 bouzouki 发表
head -c10 /dev/urandom | od -t u1 -A d -w1|sort -k2|tail -n10|cut -f1 -d' '
就算基本上可以达到要求吧
给你完善完善:
代码:
[/home/javalee]bash [/home/javalee]n=26 [/home/javalee]array=$(head -c$n /dev/urandom|od -t u1 -A d -w1|sort -k2|\ sed 's/0.*0\([1-9]\)/\1/g;/0.* /d;s/ [0-9].*//g'|tr '\n' ' ')
引用:
[/home/javalee/myshell]echo ${array[*]}
26 6 7 21 15 12 5 18 4 25 3 3 22 17 2 9 1 19 23 14 11 8 24 16
  KornLee 当前离线   回复时引用此帖
旧 03-12-28, 14:26 第 15 帖
bouzouki
 
bouzouki 的头像
 
 
注册会员  
  注册日期: Apr 2003
  我的住址: tj
  帖子: 397
  精华: 1
 

嘿嘿,原来$RANDOM也可以产生随机数,又学一招
  bouzouki 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 12:22


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org