除了生成在bash值随机数

问题描述 投票:0回答:4

我想产生一些数值之间,但除了一些数值的随机数。

我有这个:

shuf -i 1-9 -n 1

或这个:

$(( ( RANDOM % 10 )  + 1 ))

但我想排除3号和8号,例如。

bash shell random
4个回答
3
投票

Practical General Solution

除了指定一个范围内的数字,你可以指定单独使用-e选项(至少从GNU的coreutils shuf),每个有效的数字,也可以在(匿名)文件中指定的号码。由于最后一个选项是更便携(作品也对BSD shuffle),我们将使用。现在我们只具有与数字1,2,4,5,6,7,以产生输出,9。下面是一些例子:

shuf -n 1 <(seq 9 | grep -Fxv -e{3,8})

shuf -n 1 <(printf %s\\n 1 2 4 5 6 7 9)

shuf -n 1 <(printf %s\\n 1 2 {4..7} 9)

shuf -n 1 <(seq 2; seq 4 7; echo 9)

Just For Fun

对于每一个有限集合S = {I1,I2,...}在整数⊂ℕ可以拿出(用手)与多项式f,使得F(X)= IX所有X∈{0,1,...,N -1}。

一般情况下,多项式f有度n-1。有时候,我们可以用四舍五入减少的程度。在S = {1,2,4,5,6,7,9}的你的具体情况下,我们可以使用F(X)=地板(1.25倍+ 1.5)。这里是bash使用bc(该(…) / 1下舍)的实现。

bc <<< "($RANDOM % 7 * 1.25 + 1.5) / 1"

这种方法的好处是,它的工作原理普尔雷内置插件,如果我们缩放所有数字式内部,使得他们成为整数(这里我们以4倍缩放)。

echo $(( ($RANDOM % 7 * 5 + 6) / 4 ))

1
投票

这里有一种方法:

until N=$(( ( RANDOM % 10 )  + 1 )); (( $N != 3 && $N != 8 )); do true; done; echo $N

有人可能会说,这种方式是不完全有效的,但在没有明显的,简单的替代的,它应该适应。


1
投票

函数?

rnd() {
  local n=$(( $RANDOM % 10 ))
  while [[ $n =~ [038] ]]
  do n=$(( $RANDOM % 10 ))
  done
  echo $n
}

然后,你可以说x=$( rnd )


0
投票

一种简单的方式来选择从任何一组值的随机值是把在一个数组中的值,并选择一个随机项从阵列。在这种情况下:

values=(1 2 {4..7} 9)
random_value=${values[RANDOM % ${#values[*]}]}

另请参阅Select a random item from an array

上面的代码有一定的局限性。首先,这是行不通的,如果值的数量从超过32768更大的选择,因为$RANDOM的最大值为32767(数组的大小可能会成为反正数大于一个问题。)二,通过RANDOM % ${#values[*]}返回的值是(通常略)朝向下部阵列索引偏置。见Why do people say there is modulo bias when using a random number generator?以获取更多信息。如果这对你很重要,请参阅在有限的范围内rand用于产生偏见(伪)击代码的随机数的BashFAQ/026 (How can I randomize/shuffle the order of lines in a file? ...)功能。

© www.soinside.com 2019 - 2024. All rights reserved.