首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash随机数生成器,其中数字不在数组中

Bash随机数生成器,其中数字不在数组中
EN

Stack Overflow用户
提问于 2012-01-03 09:20:21
回答 3查看 1.5K关注 0票数 1

我正在尝试创建一个随机数生成器,它生成一个介于1和99之间的数字,但不会生成任何已经生成的数字。

在脚本中,array1包含已经生成的数字。为了更容易测试,我将随机数范围缩小到0- 14,并手动创建了一个数组。

我是bash脚本编程的新手,我正在通过几本书和互联网来学习它。

我尝试了多种想法,其中似乎最有意义的是

代码语言:javascript
复制
array1=( 1 2 3 6 7 8 9 10 11 12 13 )
func1() {
    for var in "${array1[@]}"
    do
      echo $var
    done
}
rnd=$[ $RANDOM % 14 ]
until [ $rnd != func1 ]
    do
        rnd=$[ $RANDOM % 14 ]
    done
echo $rnd

但是,我知道问题出在第9行,shell会看到以下代码:

代码语言:javascript
复制
until [ $rnd != 1 2 3 6 7 8 9 10 11 12 13 ]

我知道解决方案是第9行需要:

代码语言:javascript
复制
until [ $rnd != 1 ] && [ $rnd != 2 ] && [ $rnd != 3 ] && ...

我只是不知道如何从数组中自动实现这一点。该数组的长度不同,这取决于生成了多少个数字。

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

发布于 2012-01-03 10:55:49

这是我在bash中发现很难做到的事情。我想出的方法是让func1()返回true或false,然后修改数组以删除已选取的数字。

代码语言:javascript
复制
array=( {1..15} )
func1() {
   local pick="$1"
   found=1
   total=${#array[@]}
   for ((i=0;i<total;i++)); do 
      if (( pick == ${array[i]} )); then
         echo $pick
         array=( ${array[@]:0:i} ${array[@]:((i + 1)):$total})
         found=0
         break
      fi
   done
   return $found
}
numbers=3
for ((x=0;x<numbers;x++)); do 
   until func1 $(( $RANDOM % ( ${#array[@]} ) )); do 
      continue 
   done 
done
票数 1
EN

Stack Overflow用户

发布于 2012-01-03 11:58:50

正如其中一条评论所指出的,使用Knuth Shuffle是一种很好的方法

代码语言:javascript
复制
#!/bin/bash

shuffle() {
   local i tmp size max rand
   # Code from http://mywiki.wooledge.org/BashFAQ/026
   # $RANDOM % (i+1) is biased because of the limited range of $RANDOM
   # Compensate by using a range which is a multiple of the array size.
   size=${#array[*]}
   max=$(( 32768 / size * size ))

   for ((i=size-1; i>0; i--)); do
      while (( (rand=$RANDOM) >= max )); do :; done
      rand=$(( rand % (i+1) ))
      tmp=${array[i]} array[i]=${array[rand]} array[rand]=$tmp
   done
}

# Fill an array with values 1 to 99
array=({1..99});

# Shuffle the array at random
shuffle

# Echo shuffled array
echo ${array[@]}

输出

代码语言:javascript
复制
$ ./knuth
58 78 6 37 84 79 81 43 50 25 49 56 99 41 26 15 86 11 96 90 76 46 92 70 87 27 33 91 1 2 73 97 65 69 42 32 39 67 72 52 36 64 24 88 60 35 83 89 66 30 4 53 57 28 75 48 40 74 18 23 45 61 20 31 21 16 68 80 62 8 98 14 7 19 47 55 22 85 59 17 77 10 63 93 51 54 95 82 94 9 44 38 13 71 34 29 5 3 12
票数 1
EN

Stack Overflow用户

发布于 2012-01-03 18:10:14

如果您的sort版本支持,您还可以使用-R开关切换到sort

代码语言:javascript
复制
for x in {1..99} ; do echo $x ; done | sort -R
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8706954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档