将变量设置为数组中的随机项时如何指定机会?

将变量设置为数组中的随机项时如何指定机会?

目前,我执行类似的操作将变量设置为数组中的随机项:

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循环。

相关内容