# Get-Random

Der Befehl **`Get-Random`** erzeugt einen zufälligen Wert beziehungsweise wählt zufällig ein Element aus einer angegebenen Menge aus.

Mit `Get-Random` lassen sich unter anderem:

* zufällige Ganzzahlen erzeugen
* Zufallswerte innerhalb eines bestimmten Bereichs erzeugen
* zufällig ein Element aus einer Liste auswählen
* mehrere zufällige Elemente auswählen
* die Reihenfolge einer Sammlung zufällig verändern
* reproduzierbare Zufallsfolgen mit einem festen Seed erzeugen

Der Befehl gehört zu den Standard-Cmdlets von PowerShell.

---

# **Grundlagen**

### Zufällige Zahl erzeugen

Wird `Get-Random` ohne weitere Parameter aufgerufen, wird eine zufällige Ganzzahl erzeugt.

```powershell
Get-Random
```

Beispielausgabe:

```text
137582946
```

Bei jedem Aufruf kann ein anderer Wert zurückgegeben werden.

---

### Zufallszahl innerhalb eines Bereichs

Mit `-Minimum` und `-Maximum` lässt sich der Wertebereich festlegen.

```powershell
Get-Random -Minimum 1 -Maximum 100
```

Mögliche Ausgabe:

```text
73
```

> **Hinweis**
> 
> Der Wert von `-Maximum` ist **exklusiv**. Bei `-Maximum 100` können Werte von `1` bis `99` erzeugt werden.

Soll beispielsweise eine Zahl zwischen **1 und 100 einschließlich** erzeugt werden, muss `-Maximum` auf `101` gesetzt werden.

```powershell
Get-Random -Minimum 1 -Maximum 101
```

---

# **Syntax**

### Zufällige Zahl

```powershell
Get-Random
```

### Zufällige Zahl mit Bereich

```powershell
Get-Random -Minimum <Int32> -Maximum <Int32>
```

### Zufälliges Element auswählen

```powershell
Get-Random -InputObject <Object[]>
```

### Mehrere zufällige Elemente auswählen

```powershell
Get-Random -InputObject <Object[]> -Count <Int32>
```

### Sammlung zufällig mischen

```powershell
Get-Random -InputObject <Object[]> -Shuffle
```

### Zufallsfolge reproduzierbar machen

```powershell
Get-Random -SetSeed <Int32>
```

---

# **Parameter**

| Parameter      | Typ               | Beschreibung
| -------------- | ----------------- | ------------
| `-InputObject` | `Object[]`        | Gibt die Objekte an, aus denen zufällig ausgewählt wird.
| `-Minimum`     | `Int32`           | Legt die untere Grenze für eine Zufallszahl fest.
| `-Maximum`     | `Int32`           | Legt die obere Grenze für eine Zufallszahl fest.
| `-Count`       | `Int32`           | Gibt an, wie viele zufällige Elemente ausgewählt werden sollen.
| `-Shuffle`     | `SwitchParameter` | Gibt die angegebenen Elemente in zufälliger Reihenfolge zurück.
| `-SetSeed`     | `Int32`           | Legt den Startwert des Zufallszahlengenerators fest.

---

## -InputObject

##### **Beschreibung**

Der Parameter `-InputObject` gibt eine Sammlung von Objekten an, aus der `Get-Random` zufällig ein Element auswählen kann.

```powershell
Get-Random -InputObject <Objekte>
```

Beispiel:

```powershell
$Farben = "Rot", "Grün", "Blau", "Gelb"

Get-Random -InputObject $Farben
```

Mögliche Ausgabe:

```text
Blau
```

Bei jedem Aufruf kann eine andere Farbe ausgewählt werden.

#### Beispiel mit Zahlen

```powershell
$Zahlen = 10, 20, 30, 40, 50

Get-Random -InputObject $Zahlen
```

Mögliche Ausgabe:

```text
30
```

#### Beispiel mit Strings

```powershell
$Namen = "Anna", "Ben", "Clara", "David"

Get-Random -InputObject $Namen
```

Mögliche Ausgabe:

```text
Clara
```

> **Hinweis**
>
> `Get-Random` kann grundsätzlich mit beliebigen PowerShell-Objekten arbeiten, nicht nur mit Zahlen und Zeichenketten.

---

## -Minimum

##### **Beschreibung**

`-Minimum` legt den kleinsten möglichen Wert einer Zufallszahl fest.

```powershell
Get-Random -Minimum 10 -Maximum 20
```

Mögliche Ausgabe:

```text
17
```

Der Minimalwert ist **inklusiv**.

Das bedeutet:

```powershell
Get-Random -Minimum 10 -Maximum 20
```

kann unter anderem `10` zurückgeben, aber niemals `20`.

---

## -Maximum

##### **Beschreibung**

`-Maximum` legt die obere Grenze des Zufallsbereichs fest.

Der angegebene Wert ist **exklusiv**.

```powershell
Get-Random -Minimum 1 -Maximum 10
```

Mögliche Werte:

```text
1
2
3
4
5
6
7
8
9
```

Der Wert `10` wird nicht erzeugt.

#### Zufällige Zahl zwischen 0 und einem Maximum

```powershell
Get-Random -Maximum 50
```

Mögliche werte:
```powershell
0
1
2
...
49
```

---

## -Count

##### **Beschreibung**

`-Count` legt fest, wie viele zufällige Elemente zurückgegeben werden sollen.

```powershell
$Farben = "Rot", "Grün", "Blau", "Gelb", "Orange"

Get-Random -InputObject $Farben -Count 3
```

Mögliche Ausgabe:

```text
Gelb
Rot
Blau
```

Die Elemente werden dabei standardmäßig ohne Wiederholung aus der Sammlung ausgewählt.

#### Beispiel

```powershell
$Zahlen = 1..10

Get-Random -InputObject $Zahlen -Count 3
```

Mögliche Ausgabe:

```text
7
2
9
```

> **Hinweis**
>
> `-Count` bezieht sich auf die Anzahl der zurückgegebenen Elemente, nicht auf die Anzahl der durchzuführenden Zufallsoperationen.

---

## -Shuffle

##### **Beschreibung**

`-Shuffle` gibt alle über `-InputObject` übergebenen Elemente in einer zufälligen Reihenfolge zurück.

```powershell
$Zahlen = 1..10

Get-Random -InputObject $Zahlen -Shuffle
```

Mögliche Ausgabe:

```text
4
9
1
7
3
10
2
8
5
6
```

Alle Elemente bleiben erhalten, lediglich ihre Reihenfolge wird verändert.

#### Beispiel mit Namen

```powershell
$Namen = "Anna", "Ben", "Clara", "David"

Get-Random -InputObject $Namen -Shuffle
```

Mögliche Ausgabe:

```text
Clara
Anna
David
Ben
```

Das ist praktisch, wenn beispielsweise eine Liste zufällig sortiert werden soll.

---

## -SetSeed

##### **Beschreibung**

Mit `-SetSeed` kann der Startwert des Zufallszahlengenerators festgelegt werden.

```powershell
Get-Random -SetSeed 12345
```

Der Seed beeinflusst die erzeugte Zufallsfolge.

Ein identischer Seed kann dazu verwendet werden, eine reproduzierbare Zufallsfolge zu erzeugen.

```powershell
Get-Random -SetSeed 12345
```

Anschließend erzeugte Zufallswerte folgen dann derselben deterministischen Sequenz.

> **Hinweis**
>
> Ein fester Seed bedeutet nicht, dass die Werte tatsächlich zufällig und unvorhersehbar sind. Für kryptografische Zwecke ist `Get-Random` daher nicht geeignet. Zufall ist schließlich nicht automatisch Sicherheit, auch wenn Menschen das erstaunlich gerne verwechseln.

---

# **Beispiele**

## Zufällige Zahlen

#### **Zahl zwischen 0 und einem Maximum**
```powershell
Get-Random -Maximum 50
```

Mögliche Werte:
```powershell
0
1
2
...
49
```

---

#### **Zahl zwischen zwei Grenzen**

```powershell
Get-Random -Minimum 50 -Maximum 100
```

Mögliche Werte:

```text
50
51
52
...
99
```
---



#### **Zufällige Würfelzahl**

Ein Würfel besitzt die Werte `1` bis `6`.

```powershell
Get-Random -Minimum 1 -Maximum 7
```

Mögliche Ausgabe:

```text
4
```

##### Mehrfach würfeln

```powershell
1..10 | ForEach-Object {
    Get-Random -Minimum 1 -Maximum 7
}
```

Mögliche Ausgabe:

```text
3
6
1
4
2
6
5
3
1
4
```

---

## Zufällige Elemente auswählen

#### **Zufälliges Element aus einem Array**

```powershell
$Tiere = "Hund", "Katze", "Maus", "Pferd"

Get-Random -InputObject $Tiere
```

Mögliche Ausgabe:

```text
Katze
```

---

#### **Zufälliges Element aus einer Pipeline**

`Get-Random` kann auch Objekte aus der Pipeline entgegennehmen.

```powershell
"Rot", "Grün", "Blau", "Gelb" | Get-Random
```

Mögliche Ausgabe:

```text
Grün
```

Das funktioniert beispielsweise auch mit Dateien:

```powershell
Get-ChildItem | Get-Random
```

Hier wird eine zufällige Datei beziehungsweise ein zufälliges Verzeichnis aus dem aktuellen Verzeichnis ausgewählt.

---

#### **Zufällige Datei auswählen**

```powershell
Get-ChildItem "C:\Temp" -File | Get-Random
```

Damit wird ein zufälliges Dateiobjekt aus `C:\Temp` ausgewählt.

---

#### **Zufälligen Namen auswählen**

```powershell
$Namen = @(
    "Anna"
    "Ben"
    "Clara"
    "David"
    "Eva"
)

$Name = $Namen | Get-Random

$Name
```

Mögliche Ausgabe:

```text
David
```

---

## Mehrere Elemente auswählen

Mit `-Count` können mehrere Elemente aus einer Sammlung ausgewählt werden.

```powershell
$Namen = "Anna", "Ben", "Clara", "David", "Eva"

Get-Random -InputObject $Namen -Count 2
```

Mögliche Ausgabe:

```text
David
Anna
```

---

#### **Drei zufällige Dateien auswählen**

```powershell
Get-ChildItem "C:\Temp" -File |
    Get-Random -Count 3
```

Damit werden drei zufällige Dateien ausgewählt.

---

## Listen zufällig mischen

Eine Sammlung kann mit `-Shuffle` vollständig durchmischt werden.

```powershell
$Karten = 1..10

$Karten | Get-Random -Shuffle
```

Mögliche Ausgabe:

```text
7
2
10
4
1
9
6
3
8
5
```

#### Alternative mit `-Count`

Wenn eine bestimmte Anzahl zufälliger Elemente benötigt wird:

```powershell
$Karten | Get-Random -Count 3
```

Mögliche Ausgabe:

```text
8
2
5
```


### Zufälligen Benutzer auswählen

```powershell
$Benutzer = @(
    "Anna"
    "Ben"
    "Clara"
    "David"
)

$Zufall = $Benutzer | Get-Random

Write-Host "Ausgewählt: $Zufall"
```

---

### Zufällige Farbe auswählen

```powershell
$Farben = @(
    "Red"
    "Green"
    "Blue"
    "Yellow"
)

$Farbe = $Farben | Get-Random

Write-Host "Farbe: $Farbe"
```

---

### Zufällige Zahl für einen Bereich

```powershell
$Zahl = Get-Random -Minimum 1 -Maximum 101

Write-Host "Zufallszahl: $Zahl"
```

---

### Zufällige Datei auswählen

```powershell
$Datei = Get-ChildItem "C:\Temp" -File | Get-Random

Write-Host "Ausgewählte Datei: $($Datei.Name)"
```

---

### Zufällige Reihenfolge erzeugen

```powershell
$Teilnehmer = @(
    "Anna"
    "Ben"
    "Clara"
    "David"
    "Eva"
)

$Teilnehmer | Get-Random -Shuffle
```

Mögliche Ausgabe:

```text
Clara
Eva
Anna
David
Ben
```

---

## Häufige Einsatzgebiete

`Get-Random` wird häufig verwendet für:

* Zufallszahlen
* Würfelsimulationen
* zufällige Auswahl aus Listen
* zufällige Dateien oder Verzeichnisse
* Testdaten
* Simulationen
* Spiele
* zufällige Reihenfolgen
* Auswahl von Testfällen
* einfache Zufallsentscheidungen
---

# **Rückgabewerte**

Der Rückgabewert hängt davon ab, welche Eingabe verwendet wird.

| Verwendung     | Rückgabewert                                                  |
| -------------- | ------------------------------------------------------------- |
| Zufallszahl    | `System.Int32` bzw. numerischer Datentyp                      |
| `-InputObject` | Typ des ausgewählten Objekts                                  |
| `-Count`       | Mehrere Objekte                                               |
| `-Shuffle`     | Sammlung der ursprünglichen Objekte in zufälliger Reihenfolge |

Beispiel:

```powershell
$Wert = Get-Random -Minimum 1 -Maximum 100

$Wert.GetType().FullName
```

Mögliche Ausgabe:

```text
System.Int32
```

Bei Objekten bleibt deren ursprünglicher Typ erhalten.


---

# **Hinweise**

### `-Maximum` ist exklusiv

Bei:

```powershell
Get-Random -Minimum 1 -Maximum 10
```

liegt der Wertebereich zwischen `1` und `9`.

Für `1` bis `10` muss daher verwendet werden:

```powershell
Get-Random -Minimum 1 -Maximum 11
```

---

### `Get-Random` ist nicht für Kryptografie geeignet

`Get-Random` sollte nicht verwendet werden, wenn kryptografisch sichere Zufallswerte benötigt werden.

Für sicherheitsrelevante Anwendungen müssen dafür geeignete kryptografische Zufallszahlengeneratoren verwendet werden.

---

### Zufälligkeit ist nicht Gleichverteilung in kleinen Stichproben

Auch wenn eine Zufallsfunktion verwendet wird, bedeutet das nicht, dass in einer kleinen Anzahl von Durchläufen jedes Ergebnis gleich häufig erscheint.

Beispielsweise kann:

```powershell
1..10 | ForEach-Object {
    Get-Random -Minimum 1 -Maximum 7
}
```

zufällig fünfmal die `3` liefern.

Das ist kein Fehler. Zufall ist lediglich bemerkenswert schlecht darin, menschliche Erwartungen an "ausgewogen" zu erfüllen.

---

# Kurzreferenz

| Aufgabe                      | Befehl                               |
| ---------------------------- | ------------------------------------ |
| Zufällige Zahl erzeugen      | `Get-Random`                         |
| Zahl bis 99 erzeugen         | `Get-Random -Maximum 100`            |
| Zahl von 1 bis 100           | `Get-Random -Minimum 1 -Maximum 101` |
| Zufälliges Element auswählen | `$Liste \| Get-Random`               |
| Mehrere Elemente auswählen   | `$Liste \| Get-Random -Count 3`      |
| Liste mischen                | `$Liste \| Get-Random -Shuffle`      |
| Seed setzen                  | `Get-Random -SetSeed 123`            |

---

## Siehe auch

* `Get-Random`
* `System.Random`
* `System.Security.Cryptography.RandomNumberGenerator`
* `ForEach-Object`
* `Select-Object`