batch-file
Willekeurig in batchbestanden
Zoeken…
Willekeurige nummers
Met behulp van de dynamische variabele %Random%
kunnen we een willekeurig geheel getal van 0 tot 32767 krijgen. Bijvoorbeeld:
echo %random%
Dit geeft uiteraard een geheel getal van 0 tot 32767. Maar soms willen we dat het binnen een specifiek bereik ligt, bijvoorbeeld van 1 tot 100.
Willekeurige getallen genereren binnen een specifiek bereik
De basismethode om dit te doen staat hieronder vermeld.
set /a result=(%RANDOM%*max/32768)+min
waarbij max
het hoogste getal is dat kan worden gegenereerd en min
het kleinste getal dat kan worden gegenereerd. Merk op dat je geen decimale getallen krijgt omdat set /a
automatisch naar beneden afrondt. Probeer het volgende om een willekeurig decimaal getal te genereren:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Genereren van willekeurige getallen groter dan 32767
Als je het probeert
set /a whole=(%RANDOM%*65536/32768)+1
u zult waarschijnlijk willekeurige getallen krijgen die oneven zijn.
Hier is een betere methode om getallen groter dan 32767 te genereren.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
De vorige code haalt het 1 teken uit elk %random%
. Maar dit gebeurt met opzet.
Aangezien het random
nummer één cijfer kan zijn, werkt het extraheren van de laatste twee cijfers niet. Daarom extraheren we alleen het laatste karakter. In dit geval hebben we 6 %random:~-1%
, het maximum van 999999
genererend, en het minimum op 000000
, moet u dit mogelijk aanpassen aan uw behoeften.
pseudo-willekeurige
cmd.exe
genereert de seed op basis van het tijdstip waarop de cmd
sectie is gestart, dus als u de mutliple-sectie bijna tegelijkertijd start, is het resultaat mogelijk niet 'willekeurig' genoeg.
Willekeurige alfabetten
Helaas heeft batch geen ingebouwde methode om alfabetten te genereren, maar met %random%
en for
lus kunnen we alfabetten 'genereren'.
Dit is een eenvoudig idee van hoe dit werkt.
set /a result=(%random%*26/32768)+1
for /f "tokens=%result%" %%I in ("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") do (
echo %%I
)
- De eerste
set /a
instructie genereert een willekeurig getalN
tussen 1 tot 26 - De
for /f
statement kiest deN
th item uit een lijst van A tot Z.- Retourneer het resultaat
Men kan in totaal 31
items in 1 for
lus plaatsen, en vrijwel onbeperkte items met behulp van [deze methode]. ( Batch - voor lusparametervolgorde
Pseudorandom en uniforme random in batch
Pseudorandom-distributie
Overeenkomstig dit Stack Overflow antwoord wees gebruiker CherryDT op deze code:
set /a num=%random% %% 100
geeft geen uniforme verdeling.
De interne dynamische variabele %random%
doet zorgt voor een gelijkmatige verdeling, maar de bovenstaande code zal niet in een geüniformeerde willekeurig. Deze code genereert een willekeurig getal tussen 0 ~ 99, maar het resultaat is niet uniform. 0 ~ 67 zal meer dan 68 ~ 99 optreden sinds 32767 MOD 100
= 67
.
Om een uniform verdeelde random te genereren met behulp van bovenstaande code, moet 100
worden gewijzigd. Hier is een methode om een nummer te krijgen dat een uniforme verdeling creëert.
32767 mod (32767 / n)
waar n
een geheel getal is, tussen 0 ~ 32767, kan het resultaat decimaal zijn en mogelijk niet in batch werken.
Uniforme verdeling
set /a result=(%RANDOM%*100/32768)+1
Deze methode genereert een uniforme verdeling. Het vermijdt het gebruik van %
, wat meer lijkt op "rest" dan "modulus" in een batch-script. Zonder %
, is het resultaat uniform.
Als alternatief is hier een inefficiënte, maar uniforme methode.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Verander [yourMinNumber]
en [yourMaxNumber]
overeenkomstig uw eigen waarden.