Как указать шанс при установке переменной на случайный элемент в массиве?

Проблема заключалась в конфигурации сервера tftpd-hpa на хосте. Согласно руководству файл /etc/default/tftpd-hpa должен иметь вид:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/bogdan_liulko/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
RUN_DAEMON="yes"

Моя проблема была в том, что в моем файле не было параметра --create в TFT_OPTIONS. И сразу после выполнения всех шагов из руководства все заработало как надо.

6
05.02.2019, 02:37
2 ответа

Один из способов :создать параллельный массив с соответствующими шансами в процентах; ниже я масштабировал их до 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"
6
28.04.2021, 23:37

Оболочка не может выполнять математические операции с плавающей запятой, но если мы просто переместим десятичную точку, мы сможем использовать $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циклы.

6
28.04.2021, 23:37

Теги

Похожие вопросы