我想在某些值之间生成一个随机数,但某些值除外。
我有这个:
true\false
或者这个:
shuf -i 1-9 -n 1
但是我想排除数字3和数字8。
答案 0 :(得分:3)
您可以使用-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)
对于每个有限集S = {i 1 ,i 2 ,... i n }⊂ℕ整数,您可以得出( )的多项式f使得所有x∈{0,1,…,n-1}的f(x)= i x 。
通常,多项式f的阶次为n-1。有时我们可以使用舍入来降低程度。在S = {1,2,4,5,6,7,9}的具体情况下,我们可以使用f(x)= floor(1.25x + 1.5)。这是bash
中使用bc
的一种实现((…) / 1
向下舍入)。
bc <<< "($RANDOM % 7 * 1.25 + 1.5) / 1"
此方法的优点是,如果我们对公式中的所有数字进行缩放以使它们成为整数(此处我们将其缩放4倍),则它可以与内置函数一起工作。
echo $(( ($RANDOM % 7 * 5 + 6) / 4 ))
答案 1 :(得分:1)
这是一种方法:
until N=$(( ( RANDOM % 10 ) + 1 )); (( $N != 3 && $N != 8 )); do true; done; echo $N
有人可能会认为这种方法并不是十分有效,但是在没有明显,简单的替代方法的情况下,它应该适用。
答案 2 :(得分:1)
一个功能?
rnd() {
local n=$(( $RANDOM % 10 ))
while [[ $n =~ [038] ]]
do n=$(( $RANDOM % 10 ))
done
echo $n
}
然后您可以说x=$( rnd )
。
答案 3 :(得分: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?。如果您觉得这很重要,请参阅BashFAQ/026 (How can I randomize/shuffle the order of lines in a file? ...)中的rand
函数,以获取在限制范围内生成无偏(伪)随机数的Bash代码。