Змінна, вибрана випадковим чином, серед трьох чисел (10, 100 та 1000)


19

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

Зразок:

var= 10 or 100 or 1000

1
Я не програмую в UNIX, тому не можу записати код, але ось інший підхід: val = left ("1000", довжина = Випадкові 2 - 4). Щоб мати три непов'язані значення, код був би аналогічним.
Сенсій Міллер

Відповіді:


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: Замість жорсткого кодування кількості елементів у масиві, радіо елемент може бути вилучений за допомогою ${x[$RANDOM%${#x[@]}]}.


5
+1 Хоча відповідь цепеліна в цьому конкретному випадку розумна, підхід до масиву є набагато більш загальним.
Каміль Маціоровський

4
Здається, x=(10 100 1000)створює масив з буквального в баші, це було б читабельніше та ідіоматичніше
кіт

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)))

призначити його вар


:). Легко, коли ти це бачиш, але я цього не робив. Спасибі!!
Еспен Ларсен



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.