Random-Befehl mit Buchstaben
Hallo Administratoren,
ich wollte mal fragen ob es einen script oder Befehl für eine beliebige Buchstaben Reihe gibt.(Also wie %random% mit Buchstaben?
Wäre toll wen jemand eine Idee hätte.
Gruß Motorcross
ich wollte mal fragen ob es einen script oder Befehl für eine beliebige Buchstaben Reihe gibt.(Also wie %random% mit Buchstaben?
Wäre toll wen jemand eine Idee hätte.
Gruß Motorcross
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 121780
Url: https://administrator.de/contentid/121780
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo Motorcross!
In diesem Fall:
Grüße
bastla
In diesem Fall:
@echo off & setlocal
set "Zeichenvorrat=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
set G=%temp%\GetRandomText.vbs
>%G% echo Z="%Zeichenvorrat%":L=Len(Z):For i=1 To WScript.Arguments(0):Randomize:T=T^&Mid(Z,Int(Rnd*L+1),1):Next:WScript.Echo T
::Zufallstext mit Laenge 7 ermitteln
for /f %%i in ('cscript //nologo %G% 7') do set "ZText=%%i"
echo %ZText%
bastla
Reine Batchlösung etwa so:
@echo off &setlocal enabledelayedexpansion
set "source=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9"
echo %random%>nul
for /l %%a in (1,1,7) do (
set /a rdm=!random!*62/32767+1
set /a counter=0
for %%b in (%source%) do (
set /a counter+=1
if !rdm!==!counter! set "txt=!txt!%%b"
)
)
)
echo %txt%
pause
@rubberman
Oder, um die Anzahl der verfügbaren Zeichen nicht selbst ermitteln zu müssen (soferne konsequent Leerzeichen zur Trennung verwendet werden):
Natürlich scheiden bei beiden Batch-Versionen für eine Erweiterung des Zeichenvorrates um Sonderzeichen die Zeichen "," sowie ";" und "=" aus.
Grüße
bastla
Oder, um die Anzahl der verfügbaren Zeichen nicht selbst ermitteln zu müssen (soferne konsequent Leerzeichen zur Trennung verwendet werden):
@echo off &setlocal enabledelayedexpansion
set "source=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9"
set /a Pos=0
set /a Anzahl=0
:Loop
set "Char=!source:~%Pos%,1!"
if "%Char%" neq "" (
set /a Pos+=1
if "%Char%" neq " " set /a Anzahl+=1
goto :Loop
)
echo %random%>nul
set "txt="
for /l %%a in (1,1,7) do (
set /a rdm=!random!%%%Anzahl%
set /a counter=0
for %%b in (%source%) do (
if !rdm!==!counter! set "txt=!txt!%%b"
set /a counter+=1
)
)
)
echo %txt%
pause
Grüße
bastla
@bastla
keine schlechte Idee
Wo wir bei Zufallswerten sind, würde mich mal interessieren, warum beim ersten Erweitern von %random% im Batch immer nahezu der gleiche Wert heraus kommt. Ich schicke den grundsätzlich erst mal ins Nirvana. Ist das so, weil sich die Berechnungsgrundlage (Systemzeit) bei mehrmaligen Aufrufen des Batch nur wenig geändert hat? Wenn ja, was ist anders wenn die Variable während der Laufzeit des Batches erneut expandiert wird?
Grüße
rubberman
keine schlechte Idee
Wo wir bei Zufallswerten sind, würde mich mal interessieren, warum beim ersten Erweitern von %random% im Batch immer nahezu der gleiche Wert heraus kommt. Ich schicke den grundsätzlich erst mal ins Nirvana. Ist das so, weil sich die Berechnungsgrundlage (Systemzeit) bei mehrmaligen Aufrufen des Batch nur wenig geändert hat? Wenn ja, was ist anders wenn die Variable während der Laufzeit des Batches erneut expandiert wird?
Grüße
rubberman
@rubberman
Sorry - mit Deinen Fragen muss ich Dich leider an Biber verweisen, da ich die Hintergründe dieses Verhalten auch nicht kenne ...
Ansonsten hätte ich noch eine etwas kürzere Variante (mit der auch die vorhin erwähnten Sonderzeichen verwendet werden können) anzubieten:
Grüße
bastla
Sorry - mit Deinen Fragen muss ich Dich leider an Biber verweisen, da ich die Hintergründe dieses Verhalten auch nicht kenne ...
Ansonsten hätte ich noch eine etwas kürzere Variante (mit der auch die vorhin erwähnten Sonderzeichen verwendet werden können) anzubieten:
@echo off &setlocal enabledelayedexpansion
set "source=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
set /a Anzahl=0
:Loop
if "!source:~%Anzahl%,1!" neq "" set /a Anzahl+=1 & goto :Loop
echo %random%>nul
set "txt="
for /l %%a in (1,1,7) do (
set /a rdm=!random!%%%Anzahl%
call set "txt=!txt!%%source:~!rdm!,1%%"
)
echo %txt%
pause
bastla
@bastla
danke trotzdem. Und was das Zählen der Zeichen angeht - wieder ein Codeschnipsel der seinen Platz in meinen Fundus finden wird Merci.
Grüße
rubberman
<edit> & Urheber-Merci an Biber </edit>
danke trotzdem. Und was das Zählen der Zeichen angeht - wieder ein Codeschnipsel der seinen Platz in meinen Fundus finden wird Merci.
Grüße
rubberman
<edit> & Urheber-Merci an Biber </edit>
@rubberman
Grüße
bastla
ein Codeschnipsel der seinen Platz in meinen Fundus finden wird Merci.
"Merci" weitergereicht an Biber ...Grüße
bastla
Moin Motorcross,
Moin bastla & rubberman,
Noch ein kleiner Nachtrag von mir zu dem
Die zweite Behauptung kann ich meinem betagten Rechner nicht verifizieren.
Allerdings sollte dieser kleine "randomtest.cmd"-Schnipsel evtl mal auf Deinem,@rubberman, Rechner angestartet werden.
Die "Vorglüher" a] und b] sollen nur noch mal den Unterschied von Delayed/NotDelayed sichtbar machen.
Im Fall a] sind in der FOR/L-Anweisung bei jedem Schleifendurchlauf die "gleichen" %random%-Werte, da %random% eben nur einmalig aufgelöst wird.
Der Wert !random! bei B] dagegen wird verzögert aufgelöst, also nicht schon beim Parsen der Kommandozeile.
Jetzt die interessanteren Fälle c] und d]
Hier lasse ich in den FOR /L-Anweisungen jeweils das 10fache der Spannbreite des %random%-Wertebereichs abgrasen (also von 0 bis (32767x10) ).
und prüfe jeweils, ob der Wert gleich dem anfänglich ermittelten ist.
Ist er natürlich mal (gemäß Wahrscheinlichkeitsrechnung), aber nicht oft.
Das Ergebnis am Ende bestätigt NICHT, das (an meinem langsamen Rechner) der Wert des zuerst "gezogenen" %random%-Wertes sich überproportional wiederholt.
Der zuletzt gepostete "Messwert" ist schon extrem.
Ich hatte bei ein paar Testläufen meist 7 bis 9 mal einen wiederholten "Erstwert".
Würde mich interessieren, was auf einer neumodischen Renmaschine mit -zig Kernen rauskommt.
Denn: Natürlich sind alle %random%, Rnd(), Rand(), Zufallszahl() etc. pp Funktionen/Methoden in der Tat
a) nicht gleichverteilt, da b) Timer-Abhängig
Wobei allerdings die Nicht-Gleichverteilung fernab jeder Vorhersagbarkeit bestimmter Zahlen oder Werte ist.
Es ist bei weitem nicht gleichverteilt und ist auf jedem Rechner anders, soviel lässt sich sagen (beispielsweise wenn in einem Über-Nacht-Batchlauf mal die Verteilung der geraden/ungeraden Zahlen oder die Verteilung der Zahlen im ersten/zweiten....zehnten Zehntel des möglichen Wertebereichs protokolliert wird.)
Der langen Rede kurzer Sinn:
Ja, es kann sein, dass auf rubbermans Rechner der erwähnte Effekt auftritt - why not
Ja, schaden kann umgekehrt auf keinem anderen Rechner dieser Zwischenschritt "Entsorge ersten %random%-Wert.
Nein, insgesamt ist die dynamische %random%-Variable deshalb nicht "schlecht" oder untauglich.
Denn Satelliensteuerungsprogramme werden nicht als CMD-Batches zusammengetrümmert.
Grüße
Biber
Moin bastla & rubberman,
Noch ein kleiner Nachtrag von mir zu dem
- "wie zufällig ist %random%"? und
- "der erste %random%-Wert im Batch ist oft gleich dem zweiten"
Die zweite Behauptung kann ich meinem betagten Rechner nicht verifizieren.
Allerdings sollte dieser kleine "randomtest.cmd"-Schnipsel evtl mal auf Deinem,@rubberman, Rechner angestartet werden.
::-------snipp randomtest.cmd
@echo off & setlocal EnableDelayedExpansion
set "varNotDelayed=%random%"
set "varDelayed=!random!"
echo a]
echo %random% & for /L %%i in (1,1,10) do @echo %random% %random% %random%
echo b]
echo !Random! & for /L %%i in (1,1,10) do @echo !random! !random! !random!
pause
echo c] %varNotdelayed%
for /L %%i in (0,1,327670) do if !random!==%varNotDelayed% Set /a varsameND+=1
echo d] %vardelayed%
for /L %%i in (0,1,327670) do if !random!==%varDelayed% Set /a varsameD+=1
Set varsame
Im Fall a] sind in der FOR/L-Anweisung bei jedem Schleifendurchlauf die "gleichen" %random%-Werte, da %random% eben nur einmalig aufgelöst wird.
Der Wert !random! bei B] dagegen wird verzögert aufgelöst, also nicht schon beim Parsen der Kommandozeile.
$cmd$randomtest
a]
28594
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
513 21394 14416
b]
25846
22741 12404 28107
3932 27485 27891
24661 13043 13624
32441 13621 3316
14224 30689 13685
1107 14167 23582
7747 18581 12496
22074 20631 21217
9298 25027 9238
32089 8265 15617
Drücken Sie eine beliebige Taste . . .
Hier lasse ich in den FOR /L-Anweisungen jeweils das 10fache der Spannbreite des %random%-Wertebereichs abgrasen (also von 0 bis (32767x10) ).
und prüfe jeweils, ob der Wert gleich dem anfänglich ermittelten ist.
Ist er natürlich mal (gemäß Wahrscheinlichkeitsrechnung), aber nicht oft.
Das Ergebnis am Ende bestätigt NICHT, das (an meinem langsamen Rechner) der Wert des zuerst "gezogenen" %random%-Wertes sich überproportional wiederholt.
c] 6712
d] 14609
varsameD=11
varsameND=9
Der zuletzt gepostete "Messwert" ist schon extrem.
Ich hatte bei ein paar Testläufen meist 7 bis 9 mal einen wiederholten "Erstwert".
Würde mich interessieren, was auf einer neumodischen Renmaschine mit -zig Kernen rauskommt.
Denn: Natürlich sind alle %random%, Rnd(), Rand(), Zufallszahl() etc. pp Funktionen/Methoden in der Tat
a) nicht gleichverteilt, da b) Timer-Abhängig
Wobei allerdings die Nicht-Gleichverteilung fernab jeder Vorhersagbarkeit bestimmter Zahlen oder Werte ist.
Es ist bei weitem nicht gleichverteilt und ist auf jedem Rechner anders, soviel lässt sich sagen (beispielsweise wenn in einem Über-Nacht-Batchlauf mal die Verteilung der geraden/ungeraden Zahlen oder die Verteilung der Zahlen im ersten/zweiten....zehnten Zehntel des möglichen Wertebereichs protokolliert wird.)
Der langen Rede kurzer Sinn:
Ja, es kann sein, dass auf rubbermans Rechner der erwähnte Effekt auftritt - why not
Ja, schaden kann umgekehrt auf keinem anderen Rechner dieser Zwischenschritt "Entsorge ersten %random%-Wert.
Nein, insgesamt ist die dynamische %random%-Variable deshalb nicht "schlecht" oder untauglich.
Denn Satelliensteuerungsprogramme werden nicht als CMD-Batches zusammengetrümmert.
Grüße
Biber
@Biber,
vielen Dank für das ausführliche Workaround mit allerdings auch nicht sonderlich überaschenden Ergebnissen. Ich denke etwas missverständlich war mein Posting von oben wahrscheinlich. Was ich meinte ist wesentlich einfacherer Natur:
Diesen Schnipsel mehrfach händisch hintereinander gestartet, ergibt bei mir Werte, die sich zwar voneinander unterscheiden, allerdings nicht signifikant. Das heißt, wenn diese Werte in kleinere umgerechnet werden, erhält man dann oft genug gar keine Unterschiede mehr.
Grüße
rubberman
vielen Dank für das ausführliche Workaround mit allerdings auch nicht sonderlich überaschenden Ergebnissen. Ich denke etwas missverständlich war mein Posting von oben wahrscheinlich. Was ich meinte ist wesentlich einfacherer Natur:
@echo off &setlocal
set /a rdm=%random%
set /a rdm2=%rdm%*100/32767
echo Originalwert: %rdm%
echo umgerechneter Wert: %rdm2%
pause
Grüße
rubberman