LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 7439|回复: 14

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

[复制链接]
发表于 2003-12-26 12:40:39 | 显示全部楼层 |阅读模式
如:输入10,那么显示数组的所有元素,但是各个元素的排列是随机的( 3 0 9 7 4 2 1 8 5 6),而不是顺序排列( 0 1 2 3 4 5 6 7 8 9)!
发表于 2003-12-26 15:40:37 | 显示全部楼层
 楼主| 发表于 2003-12-26 16:05:53 | 显示全部楼层
最初由 home 发表
可做参考。
http://www.linuxsir.cn/forum.php?mod=viewthread&tid=66426

这个贴子只能产生随机数,我用的方法是先创建一个初始数组,比如10,那么数组A就有10个元素,再建一个空的数组,然后用RANDOM产生随机数跟数组A来比较,出现过的元素被送至数组B,数组A用grep -v的形式再重新赋值创建,当循环的次数大于$1的时候退出,最后再用export导出,也就是说真正的可以在命令行中用echo ${array
  • }回显出来~,目前难点是如果参数>=10的时候还得作些处理~,10以内的我作出来了,这是我做的,请指教
    1. [/home/javalee/myshell]cat rand
    2. #!/bin/ksh
    3. #
    4. set -A newarray
    5. n=1
    6. set -A array $(while ((n<=$1));do
    7.         echo -n "$n "
    8.         ((n+=1))
    9. done)
    10. echo "old array: ${array[*]}"
    11. i=0
    12. while
    13. do
    14.         rand=$(echo $RANDOM|cut -b1)  #???目前在努力...
    15.         if echo ${array[*]}|tr ' ' '\n'|grep -q $rand ;then
    16.         newarray[$i]=$rand
    17.         set -A array $(echo -n ${array[*]}|tr ' ' '\n'|grep -v $rand|tr '\n' ' ')
    18.         ((i+=1))
    19.         else continue
    20.         fi
    21.         export var=${newarray[*]}
    22.         if [[ ${#newarray[*]} -eq $1 ]];then
    23.                 break
    24.         fi
    25. done
    26. set -A _array $(echo $var)
    27. echo "new array:${_array[*]}"
    28. 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
  • 发表于 2003-12-26 18:09:34 | 显示全部楼层
    另外一个思路
    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 $
  •  楼主| 发表于 2003-12-26 18:57:22 | 显示全部楼层
    最初由 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 $

  • :thank 这个sort用得妙!,呵呵~~,看来我把问题想复杂啦~,我借用了perl 的rand()函数,结果效果还是不好~
    发表于 2003-12-26 21:29:30 | 显示全部楼层
    读 /dev/urandom 可以得到无符号的随机数
     楼主| 发表于 2003-12-26 22:01:29 | 显示全部楼层
    最初由 bouzouki 发表
    读 /dev/urandom 可以得到无符号的随机数

    怎么读? 请指教 :thank
    发表于 2003-12-27 00:14:49 | 显示全部楼层
    比如要产生十个随机数(0~256):
    head -c10 /dev/urandom | od -t u1 -A none
     楼主| 发表于 2003-12-27 00:20:13 | 显示全部楼层
    最初由 bouzouki 发表
    比如要产生十个随机数(0~256):
    head -c10 /dev/urandom | od -t u1 -A none

    :thank bouzouki兄
    那个-u1怎么解释呀~~,谢谢!
     楼主| 发表于 2003-12-27 00:43:41 | 显示全部楼层
    哦,解释在这里 ;)
    [/home/javalee/myshell]od --help
    ...
    u[SIZE]    unsigned decimal, SIZE bytes per integer
    ...
    不过这样固然可以产生的随机数还是无法满足题目的要求呀,
    I am try think~~~ :ask
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表