Zufallszahlen mit der PowerShell

Im letzten Blogeintrag haben wir uns die mathematische .NET angeschaut und ein bisschen gerundet.

In diesem Blogeintrag schauen wir uns an, wie man Zufallszahlen erzeugen kann.

Der grundlegende Befehl für Zufallszahlen heißt Get-Random:

PS C:\> Get-Random

834947768

PS C:\> Get-Random
834947768

Ohne weitere Parameter wird eine Zahl zwischen 0 und 2.147.483.647 (das ist die größer 32bit Integer Zahl) ausgegeben.

Mit den Parametern –maximum und –minimum kann man diesen Zahlenbereich eingrenzen.

 

Folgendermaßen kann man zum Beispiel einen Würfelwurf simulieren:

Get-Random -Minimum 1 -Maximum 6 # Falsch

[Update 22.03.23] Das verhält sich nicht wie gedacht (die 6 fehlt).

Besser ist

Get-Randon (1..6) # Nimm aus der Zahlenreihe 1 bis 6 eine beliebige Zahl

oder

Get-Randon -Minimum 1 -Maximum 7 # Nimm eine ganze Zahl größergleich 1 und kleiner 7

Get-Random (1..6)
2

Get-Random -Minimum 1 -Maximum 7
6

 

Negative Zahlen und Dezimalzahlen sind auch möglich:

Get-Random -Minimum -0.99 -Maximum 0.99

-0,160597725217509

PS C:\> Get-Random -Minimum -0.99 -Maximum 0.99
-0,160597725217509

 

Wenn ich hier nur 2 Stellen nach dem Komma möchte, dann kann ich dies mit der .NET Formatierung aus einem vorherigen Artikel erreichen.

"{0:N2}" -f (Get-Random -Minimum -0.99 -Maximum 0.99)

-0,39

PS C:\> "{0:N2}" -f (Get-Random -Minimum -0.99 -Maximum 0.99)
-0,39

 

Auch zum zufälligen bestimmen der Lottozahlen kann man diesen Befehl gut nutzen. In diesem Beispiel hätte ich gerne 6 aus 49, aber keine 13. Hierfür übergebe ich 2 Zahlenarrays an den Befehl als Input und –count gibt die Anzahl der zufällig auszuwählenden Zahlen aus:

Get-Random -InputObject ((1..12)+(14..49)) -Count 6

1

6

38

31

29

16

PS C:\> Get-Random -InputObject ((1..12)+(14..49)) -Count 6
1
6
38
31
29
16

 

Natürlich können beliebige Objekte als Eingabe genutzt werden. So kann man russisch Roulette auf seinen Systemen spielen. Der –whatif Parameter verhindert, dass der Prozess wirklich abgeschossen wird.

Get-Process | Get-Random | Stop-Process -WhatIf

WhatIf: Ausführen des Vorgangs "Stop-Process" für das Ziel "svchost (12832)".

PS C:\> Get-Process | Get-Random | Stop-Process -WhatIf
WhatIf: Ausführen des Vorgangs "Stop-Process" für das Ziel "svchost (12832)".

 

Power Tipp:

Mit einem ganz anderen Befehl kann ich zufällige Hexadezimalzahlen erzeugen. Der Befehl New-Guid erzeugt einen zufälligen „Global unique identifier“ und dieser besteht aus Hexadezimalzahlen:

PS C:\> New-Guid

Guid

----

b81f4921-fcb2-4def-8365-79c0a1611100

 

Hier kann ich durch String Manipulationen zum Beispiel 8 Hexadezimalzahlen ausschneiden.

$length = 8

(New-Guid).Tostring().replace("-","").Substring((Get-Random -Minimum 0 -Maximum (31-$length)),$length)

53c4f340

PS C:\> $length = 8
PS C:\> (New-Guid).Tostring().replace("-","").Substring((Get-Random -Minimum 0 -Maximum (31-$length)),$length)
53c4f340

Im nächsten Blogeintrag beschäftigen wir uns mit SMTP Hauptadressen.

 

2 Kommentare

  • Antworten Detmar Brand |

    Hallo,

    „Get-Random –Minimum 1 –Maximum 6“ simuliert leider keinen 6-seitigen Würfel. Warum ist intuitiv nicht wirklich ersichtlich, man müsste -Maximum 7 schreiben, sonst erhalten Sie nie eine 6.

    Besser ist Get-Random (1..6), oder Get-Random (1,2,3,4,5,6) oder 1..6 | Get-Random

    Hat mich leider bei einer Schulung sehr verwirrt, bis ich darauf kam ;-),

    LG

    DB

    • Antworten Boris Birneder |

      Hallo, stimmt. Das ist zwar unlogisch, aber es kommt keine 6.
      Get-Random (1..6) ist hier die bessere Lösung. Danke.

Was denken Sie?

Pflichtfelder sind mit einem * markiert.