Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中生成除值以外的随机数_Bash_Shell_Random - Fatal编程技术网

在bash中生成除值以外的随机数

在bash中生成除值以外的随机数,bash,shell,random,Bash,Shell,Random,我想在一些值之间生成一个随机NUMBER,但有些值除外 我有这个: shuf -i 1-9 -n 1 或者这个: $(( ( RANDOM % 10 ) + 1 )) 但我想排除数字3和数字8,例如。这里有一种方法: until N=$(( ( RANDOM % 10 ) + 1 )); (( $N != 3 && $N != 8 )); do true; done; echo $N 有人可能会说这种方法效率不高,但如果没有一种明显、简单的替代方法,它应该适合。实用的通

我想在一些值之间生成一个随机NUMBER,但有些值除外

我有这个:

shuf -i 1-9 -n 1
或者这个:

$(( ( RANDOM % 10 )  + 1 ))
但我想排除数字3和数字8,例如。

这里有一种方法:

until N=$(( ( RANDOM % 10 )  + 1 )); (( $N != 3 && $N != 8 )); do true; done; echo $N
有人可能会说这种方法效率不高,但如果没有一种明显、简单的替代方法,它应该适合。

实用的通用解决方案 您可以使用
-e
选项(至少对于GNU coreutils中的
shuf
)单独指定每个有效数字,而不是指定数字的范围,或者可以在(匿名)文件中指定数字。由于最后一个选项更便于移植(也适用于BSD上的
shuffle
),我们将使用它。现在我们只需要生成数字为1、2、4、5、6、7、9的输出。以下是一些例子:

shuf -n 1 <(seq 9 | grep -Fxv -e{3,8})
这种方法的一个好处是,如果我们对公式中的所有数字进行缩放,使它们成为整数(这里我们按4的因子进行缩放),那么它可以与内置的purley一起工作

函数

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

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

从任何一组值中选择一个随机值的简单方法是将这些值放入一个数组,然后从数组中选择一个随机项。在这种情况下:

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


上面的代码有一些限制。首先,如果要从中选择的值的数目大于32768,则该函数不起作用,因为
$RANDOM
的最大值为32767。(数组的大小可能会成为大于该值的数字的问题。)其次,
RANDOM%${#values[*]}
返回的值(通常稍微)偏向较低的数组索引。有关更多信息,请参阅。如果这对您很重要,请参阅for Bash代码中的
rand
函数,该函数在限定范围内生成无偏(伪)随机数。

如果生成3或8,则重新生成它?循环将远远优于递归函数。True。我会修好的。只是在工作的间隙玩得开心,哈哈
shuf -n 1 <(seq 2; seq 4 7; echo 9)
bc <<< "($RANDOM % 7 * 1.25 + 1.5) / 1"
echo $(( ($RANDOM % 7 * 5 + 6) / 4 ))
rnd() {
  local n=$(( $RANDOM % 10 ))
  while [[ $n =~ [038] ]]
  do n=$(( $RANDOM % 10 ))
  done
  echo $n
}
values=(1 2 {4..7} 9)
random_value=${values[RANDOM % ${#values[*]}]}