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 nummer N mellan 1 och 26
  • for /f uttalet väljer det N 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow