Czy można mieć zmienną, która wybiera losową liczbę z trzech wcześniej ustalonych liczb?
Próba:
var= 10 or 100 or 1000
Czy można mieć zmienną, która wybiera losową liczbę z trzech wcześniej ustalonych liczb?
Próba:
var= 10 or 100 or 1000
Odpowiedzi:
Użyj tablicy do przechowywania wartości i wybierz jedną z nich za pomocą wbudowanej zmiennej $RANDOM
. Na przykład,
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
Jakość losowości nie będzie najlepsza z możliwych (w tym celu odczytane bajty /dev/urandom
), ale powinna być wystarczająco dobra dla skryptu.
Uwaga 1: Jak ludzie zaobserwowali w komentarzach, zamiast inicjowanie elementów tablicy indywidualnie Można oczywiście użyć litteral tablicy: x=(10 100 1000)
.
Uwaga 2: Zamiast zakodować na stałe liczbę elementów w tablicy, element radomowy można wyodrębnić za pomocą ${x[$RANDOM%${#x[@]}]}
.
x=(10 100 1000)
tworzy tablicę z dosłownego bash, byłoby to bardziej czytelne i bardziej idiomatyczne
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.
coś takiego?
Jeśli używasz bash (lub zsh lub ksh93 ), możesz po prostu zrobić:
echo "$((10**($RANDOM%3+1)))"
lub
var=$((10**($RANDOM%3+1)))
przypisać go do var
Możesz także użyć shuf
narzędzia GNU coreutils :
a=$(shuf -n1 -e 10 100 1000)
Korzystanie RANDOM
z innych odpowiedzi jest jednak prawie na pewno szybsze.
Oto nieco tajemniczy sposób:
printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0
Spowoduje to przypisanie losowej wartości do $var
potrzeb. printf
Ciąg format 1%0Nd
- to powoduje, 0
który ma zostać wydrukowany z N
wiodącymi zerami, gdzie N
będzie losową liczbę całkowitą z przedziału [1,3]
.