motorcross
Goto Top

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

Content-ID: 121780

Url: https://administrator.de/contentid/121780

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

bastla
bastla 31.07.2009 um 16:25:29 Uhr
Goto Top
Hallo Motorcross!

Gut, dass Du uns nicht mit unnötigen Details wie
  • wieviele Buchstaben,
  • welche Buchstaben (Groß- und/oder Kleinbuchstaben), ev
  • auch Sonderzeichen
verwirren willst ...

Dass die Verwendung in einem Batch erfolgen soll, ist natürlich als selbstverständlich vorauszusetzen.

Grüße
bastla
Motorcross
Motorcross 31.07.2009 um 16:45:36 Uhr
Goto Top
Hallo bastla,
weißt du denn wie man so etwas programmieren kann?
Gruß Motorcross
bastla
bastla 31.07.2009 um 17:03:16 Uhr
Goto Top
Hallo Motrocross!
weißt du denn wie man so etwas programmieren kann?
Solange ich nicht weiß, was "so etwas" tatsächlich sein soll, kann ich diese Frage nicht beantworten ...

Grüße
bastla
Motorcross
Motorcross 31.07.2009 um 23:04:53 Uhr
Goto Top
Hallo bastla,
ich suche nach einem Script, dass zufällige bustaben von sich gibt wie z.B. ziethumk. In diesem Wort können auch Ziffern sein.(Egal)
Es ist auch egal wie viele Buchstaben es sind.Es wäre gut, wenn es 6 oder 7 wären.
Hättest du eine Idee?
Gruß Motorcross
bastla
bastla 31.07.2009 um 23:34:42 Uhr
Goto Top
Hallo Motorcross!

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%
Grüße
bastla
rubberman
rubberman 31.07.2009 um 23:58:31 Uhr
Goto Top
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
bastla
bastla 01.08.2009 um 00:25:53 Uhr
Goto Top
@rubberman
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
Natürlich scheiden bei beiden Batch-Versionen für eine Erweiterung des Zeichenvorrates um Sonderzeichen die Zeichen "," sowie ";" und "=" aus.

Grüße
bastla
rubberman
rubberman 01.08.2009 um 00:44:57 Uhr
Goto Top
@bastla
keine schlechte Idee face-wink

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
bastla
bastla 01.08.2009 um 00:55:16 Uhr
Goto Top
@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:
@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
Grüße
bastla
rubberman
rubberman 01.08.2009 um 01:12:12 Uhr
Goto Top
@bastla
danke trotzdem. Und was das Zählen der Zeichen angeht - wieder ein Codeschnipsel der seinen Platz in meinen Fundus finden wird face-wink Merci.

Grüße
rubberman

<edit> & Urheber-Merci an Biber </edit>
bastla
bastla 01.08.2009 um 01:23:30 Uhr
Goto Top
@rubberman
ein Codeschnipsel der seinen Platz in meinen Fundus finden wird face-wink Merci.
"Merci" weitergereicht an Biber face-smile ...

Grüße
bastla
Motorcross
Motorcross 01.08.2009 um 09:53:45 Uhr
Goto Top
Hallo bastla und rubbermann,
ihr habt tolle Scribts programmiert kompliment!
Gruß Motorcross
Biber
Biber 02.08.2009 um 01:48:20 Uhr
Goto Top
Moin Motorcross,
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
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.
$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 . . .
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.
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
rubberman
rubberman 02.08.2009 um 14:54:30 Uhr
Goto Top
@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:
@echo off &setlocal
set /a rdm=%random%
set /a rdm2=%rdm%*100/32767
echo Originalwert: %rdm%
echo umgerechneter Wert: %rdm2%
pause
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