batch-file
Slumpmässiga i batchfiler
Sök…
Slumpmässiga siffror
Med hjälp av den dynamiska variabeln %Random%
kan vi få ett slumpmässigt heltal från 0 till 32767. Till exempel:
echo %random%
Detta ger uppenbarligen ett heltal från 0 till 32767. Men ibland vill vi att det ska ligga inom ett visst intervall, säga från 1 till 100.
Generera slumpmässiga nummer inom ett specifikt intervall
Den grundläggande metoden för att göra detta listas nedan.
set /a result=(%RANDOM%*max/32768)+min
där max
är det högsta antalet som kan genereras och min
är det minsta antalet som kan genereras. Observera att du inte får några decimaltal eftersom set /a
avrundas automatiskt. För att generera ett decimalt slumptal, prova detta:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Genererar slumpmässiga nummer större än 32767
Om du försöker
set /a whole=(%RANDOM%*65536/32768)+1
du kommer sannolikt att få slumpmässiga siffror som är udda.
För att generera siffror större än 32767 är här en bättre metod.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
Den föregående koden extraherar 1 karaktär från varje %random%
. Men detta görs med avsikt.
Eftersom det random
numret kan vara ett siffrigt nummer fungerar inte extraktion av de sista två siffrorna. Det är därför vi bara extraherar den sista karaktären. I det här fallet har vi 6 %random:~-1%
, genererar maximalt 999999
, och det minsta på 000000
, kanske du måste justera detta för att passa dina behov.
pseudoslump
cmd.exe
genererar fröet baserat på tiden då cmd
sektionen började, så om du startar maktdelssektionen på nästan samma tid kan resultatet kanske inte vara "slumpmässigt" tillräckligt.
Slumpmässiga alfabet
Tyvärr har batch inte en inbyggd metod för att generera alfabet, men med %random%
och for
slinga kan vi "generera" alfabet.
Detta är en enkel idé om hur detta fungerar.
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
)
- Den första
set /a
uttalande genererar ett slumpmässigt nummerN
mellan 1 och 26 -
for /f
uttalet väljer detN
a objektet från en lista med A till Z.- Returnera resultatet
Man kan lägga totalt 31
objekt i 1 for
loop och praktiskt taget obegränsade objekt med [denna metod]. ( Batch - för loopparameterordning
Pseudorandom och enhetligt slumpmässigt i parti
Pseudorandom distribution
I enlighet med detta Stack Overflow-svar påpekade användaren CherryDT denna kod:
set /a num=%random% %% 100
ger inte en enhetlig fördelning.
Den inre dynamisk variabel %random%
gör ger en likformig fördelning, men ovanstående kod inte kommer att vara en uniformerad slumpmässig. Denna kod genererar ett slumpmässigt tal mellan 0 ~ 99, men resultatet blir inte enhetligt. 0 ~ 67 kommer att inträffa mer än 68 ~ 99 sedan 32767 MOD 100
= 67
.
För att skapa en enhetlig distribuerad slumpmässig användning av koden ovan måste 100
ändras. Här är en metod för att få ett nummer som skapar en enhetlig fördelning.
32767 mod (32767 / n)
där n
är ett heltal, mellan 0 ~ 32767, kan resultatet vara decimal och kanske inte fungerar i batch.
Jämn fördelning
set /a result=(%RANDOM%*100/32768)+1
Denna metod genererar en enhetlig distribution. Det undviker att använda %
, vilket är mer som "återstående" än "modul" i ett batchskript. Utan att använda %
kommer resultatet att vara enhetligt.
Alternativt är här en ineffektiv, men enhetlig metod.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Ändra [yourMinNumber]
och [yourMaxNumber]
enlighet med dina egna värden.