Zmienna wybierana losowo spośród trzech liczb (10, 100 i 1000)

19

Czy można mieć zmienną, która wybiera losową liczbę z trzech wcześniej ustalonych liczb?

Próba:

var= 10 or 100 or 1000
Espen Larsen
źródło
1
Nie programuję w systemie UNIX, więc nie mogę napisać kodu, ale oto inne podejście: val = left („1000”, length = Random 2 do 4). Aby mieć trzy niepowiązane wartości, kod byłby podobny.
Sensii Miller,

Odpowiedzi:

31

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[@]}]}.

AlexP
źródło
5
+1 Podczas gdy odpowiedź zeppelina jest sprytna w tym konkretnym przypadku, podejście tablicowe jest o wiele bardziej ogólne.
Kamil Maciorowski
4
Wygląda na to, że x=(10 100 1000)tworzy tablicę z dosłownego bash, byłoby to bardziej czytelne i bardziej idiomatyczne
cat
1
@cat: Opinia na temat czytelności jest różna. Lubię umieszczać poszczególne elementy w osobnych wierszach, zwykle z końcowymi komentarzami wyjaśniającymi wartość.
AlexP
@AlexP Oh, chyba nie skomentowałbym, jeśli myślałem, że to celowo. dość uczciwe
kot
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.coś takiego?
Nick T
30

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

zepelin
źródło
:) Łatwo kiedy to widzisz, ale ja nie. Dzięki!!
Espen Larsen,
20

Możesz także użyć shufnarzędzia GNU coreutils :

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

Korzystanie RANDOMz innych odpowiedzi jest jednak prawie na pewno szybsze.

Cyfrowa trauma
źródło
To najlepsza odpowiedź.
Tulains Córdova,
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
źródło
5

Oto nieco tajemniczy sposób:

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

Spowoduje to przypisanie losowej wartości do $varpotrzeb. printfCiąg format 1%0Nd- to powoduje, 0który ma zostać wydrukowany z Nwiodącymi zerami, gdzie Nbędzie losową liczbę całkowitą z przedziału [1,3].

Cyfrowa trauma
źródło