Variable, die zufällig aus drei Zahlen ausgewählt wurde (10, 100 und 1000)

19

Kann es eine Variable geben, die eine Zufallszahl aus drei vorab festgelegten Zahlen auswählt?

Probe:

var= 10 or 100 or 1000
Espen Larsen
quelle
1
Ich programmiere nicht unter UNIX, daher kann ich den Code nicht schreiben. Hier ist jedoch ein anderer Ansatz: val = left ("1000", length = Random 2 bis 4). Bei drei unabhängigen Werten wäre der Code ähnlich.
Sensii Miller

Antworten:

31

Verwenden Sie ein Array, um die Werte zu speichern, und wählen Sie sie mithilfe der integrierten Variablen aus $RANDOM. Beispielsweise,

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

Die Qualität der Zufälligkeit wird nicht die bestmögliche sein (dafür Bytes lesen /dev/urandom), aber sie sollte für ein Skript mehr als gut genug sein.

Anmerkung 1: Da die Menschen in den Kommentaren beobachtet haben, statt die Array - Elemente einzeln eine Dose Initialisierung natürlich ein Array Litteral benutzen x=(10 100 1000).

Anmerkung 2: Anstatt die Anzahl der Elemente im Array fest zu codieren, kann ein Radomelement mit extrahiert werden ${x[$RANDOM%${#x[@]}]}.

AlexP
quelle
5
+1 Während die Antwort von Zeppelin in diesem speziellen Fall klug ist, ist der Array-Ansatz so viel allgemeiner.
Kamil Maciorowski
4
Scheint, als würde x=(10 100 1000)ein Array aus einem Literal in bash erstellt. Dies wäre lesbarer und idiomatischer
cat
1
@cat: Meinung zur Lesbarkeit unterschiedlich. Ich mag es, einzelne Elemente in separate Zeilen zu setzen, in der Regel mit abschließenden Kommentaren, die den Wert erklären.
AlexP
@AlexP Oh, ich würde wohl keinen Kommentar abgeben, wenn ich der Meinung wäre, dass es absichtlich war. aber fair genug
Katze
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.sowas?
Nick T
30

Wenn Sie bash (oder zsh oder ksh93 ) verwenden, können Sie einfach Folgendes tun:

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

oder

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

es var zuweisen

Zeppelin
quelle
:). Einfach, wenn du es siehst, aber ich habe es nicht getan. Vielen Dank!!
Espen Larsen
20

Sie können auch das GNU- shufDienstprogramm coreutils verwenden :

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

Die Verwendung RANDOMder anderen Antworten ist jedoch mit ziemlicher Sicherheit schneller.

Digitales Trauma
quelle
Das ist die beste Antwort.
Tulains Córdova
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
quelle
5

Hier ist ein leicht kryptischer Weg:

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

Dies weist den Zufallswert nach $varBedarf zu. Die printfFormatzeichenfolge lautet 1%0Nd- dies führt 0dazu, dass sie mit Nführenden Nullen gedruckt wird , wobei Ndas Intervall eine zufällige Ganzzahl ist [1,3].

Digitales Trauma
quelle