Переменная, случайно выбранная из трех чисел (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[@]}]}.


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


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



5

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.