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 getal N tussen 1 tot 26
  • De for /f statement kiest de N 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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow