目前,我执行类似的操作将变量设置为数组中的随机项:
array=("foo" "bar" "baz")
var=${array[$RANDOM % ${#array[@]} ]}
如果我想设置$var
为这些值之一,但指定变量分别设置为每一项的值的机会,该怎么办?假设我想要 73.3% 的机会foo
、26.6% 的机会bar
和 0.1% 的机会baz
。
答案1
一种方式:建立一个并行数组,并设置相应的百分比机会;下面,我将它们缩放到 1000。然后,选择 1 到 1000 之间的随机数并迭代数组,直到用完机会:
#!/bin/bash
array=( "foo" "bar" "baz")
chances=(733 266 1)
choice=$((1 + (RANDOM % 1000)))
value=
for((index=0; index < ${#array[@]}; index++))
do
choice=$((choice - ${chances[index]}))
if [[ choice -le 0 ]]
then
value=${array[index]}
break
fi
done
[[ index -eq ${#array[@]} ]] && value=${array[index]}
printf '%s\n' "$value"
答案2
shell 无法进行浮点数学运算,但如果我们只移动小数点,我们可以使用$RANDOM
整数数学运算:
#!/usr/local/bin/bash
array=("foo" "bar" "baz")
dieroll=$(($RANDOM % 1000))
if [[ "$dieroll" -lt 1 ]]; then
printf "%s\n" "${array[2]}"
elif [[ "$dieroll" -lt 266 ]]; then
printf "%s\n" "${array[1]}"
else
printf "%s\n" "${array[0]}"
fi
这样做的优点是不必将数组增加到 1000 个条目或不需要任何for
循环。