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.
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
Hallo, stimmt. Das ist zwar unlogisch, aber es kommt keine 6.
Get-Random (1..6) ist hier die bessere Lösung. Danke.