Переменная, случайно выбранная из трех чисел (10, 100 и 1000)

19

Возможно ли иметь переменную, которая выбирает случайное число из трех заранее определенных чисел?

Образец:

var= 10 or 100 or 1000
Эспен Ларсен
источник
1
Я не программирую в UNIX, поэтому я не могу написать код, но есть другой подход: val = left ("1000", length = Random от 2 до 4). Чтобы иметь три несвязанных значения, код был бы похожим.
Sensii Miller

Ответы:

31

Используйте массив для хранения значений и выбирайте среди них встроенную переменную $RANDOM. Например,

x[0]=10     # One decade
x[1]=100    # One century
x[2]=1000   # One millennium

for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10

Качество случайности не будет наилучшим (читайте байты /dev/urandomдля этого), но оно должно быть более чем достаточно для сценария.

Примечание 1: Как люди наблюдали в комментариях, вместо того , чтобы инициализировать элементы массива по отдельности , конечно , можно использовать litteral массива: x=(10 100 1000).

Примечание 2: Вместо жесткого кодирования количества элементов в массиве, элемент radom может быть извлечен с помощью ${x[$RANDOM%${#x[@]}]}.

AlexP
источник
5
+1 Хотя в этом конкретном случае ответ Цеппелина умный, подход с использованием массивов гораздо более общий.
Камиль Мачоровски
4
Похоже, x=(10 100 1000)создает массив из литерала в bash, это было бы более читабельным и более идиоматическим
кошка
1
@cat: Мнения о читабельности различаются. Мне нравится размещать отдельные элементы на отдельных строках, обычно с последующими комментариями, объясняющими ценность.
AlexP
@AlexP О, я бы не стал комментировать, если бы думал, что это специально. хотя честно
кот
1
@AlexP x[0]=10 # This sets the first value of x to ten. Ten is the number of fingers that humans have (excepting birth defects or mutilation). It is also the sum of 9 and 1, or product of 5 and 2. Ten is not prime. A traditional Christmas gift is ten lords a-leaping.что-то подобное?
Ник Т
30

Если вы используете bash (или zsh или ksh93 ), вы можете просто сделать:

echo "$((10**($RANDOM%3+1)))"

или

var=$((10**($RANDOM%3+1)))

назначить его в var

дирижабль
источник
:). Легко, когда ты это видишь, но я этого не сделал. Благодарность!!
Эспен Ларсен
20

Вы также можете использовать shufутилиту GNU coreutils :

a=$(shuf -n1 -e 10 100 1000)

Использование RANDOMв соответствии с другими ответами почти наверняка быстрее, хотя.

Цифровая травма
источник
Это лучший ответ.
Тулаинс Кордова
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
источник
5

Вот немного загадочный способ:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0

Это назначит случайное значение $varкак требуется. printfФорматная строка 1%0Nd- это приводит 0к печататься с Nведущими нулями, где Nбудет случайным целым числом в интервале [1,3].

Цифровая травма
источник