batch-file
Losowo w plikach wsadowych
Szukaj…
Losowe liczby
Używając zmiennej dynamicznej %Random% , możemy uzyskać losową liczbę całkowitą od 0 do 32767. Na przykład:
echo %random%
To oczywiście zwraca liczbę całkowitą od 0 do 32767. Ale czasami chcemy, aby była w określonym zakresie, powiedzmy od 1 do 100.
Generowanie liczb losowych w określonym zakresie
Podstawową metodę tego można znaleźć poniżej.
set /a result=(%RANDOM%*max/32768)+min gdzie max to najwyższa liczba, którą można wygenerować, a min to najmniejsza liczba, którą można wygenerować. Zauważ, że nie dostaniesz żadnych liczb dziesiętnych, ponieważ set /a zaokrągla automatycznie. Aby wygenerować dziesiętną liczbę losową, spróbuj tego:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal% Generowanie liczb losowych większych niż 32767
Jeśli spróbujesz
set /a whole=(%RANDOM%*65536/32768)+1
najprawdopodobniej otrzymasz liczby losowe, które są nieparzyste.
Aby wygenerować liczby większe niż 32767, oto lepsza metoda.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
Poprzedni kod wyodrębnia 1 znak z każdego %random% . Ale odbywa się to celowo.
Ponieważ liczba random może być liczbą jednocyfrową, wyodrębnienie ostatnich 2 cyfr nie będzie działać. Dlatego wydobywamy tylko ostatnią postać. W tym przypadku mamy 6 %random:~-1% , generując maksimum 999999 , a minimum na 000000 , może być konieczne dostosowanie tego do własnych potrzeb.
Pseudolosowy
cmd.exe generuje ziarno na podstawie czasu uruchomienia sekcji cmd , więc jeśli uruchomisz sekcję wielokrotną w tym samym czasie, wynik może nie być wystarczająco „losowy”.
Losowe alfabety
Niestety partia nie ma wbudowanej metody generowania alfabetów, ale używając %random% i for pętli możemy „generować” alfabety.
To prosty pomysł, jak to działa.
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
)
- Pierwszy
set /ainstrukcja generuje losową liczbęNod 1 do 26 - Instrukcja
for /fwybieraNty element z listy od A do Z.- Zwróć wynik
Można umieścić w sumie 31 produktów w 1 for pętli i praktycznie nieograniczone elementów przy użyciu [tej metody] (. Batch - w pętli parametr uporządkowania
Pseudolosowe i jednolite losowo w partii
Dystrybucja pseudolosowa
Zgodnie z odpowiedzią dotyczącą przepełnienia stosu użytkownik CherryDT wskazał ten kod:
set /a num=%random% %% 100
nie daje jednolitego rozkładu.
Wewnętrzna zmienna dynamiczna %random% nie daje równomierną dystrybucję, ale powyższy kod nie będzie umundurowany losowy. Ten kod generuje losową liczbę między 0 ~ 99, ale wynik nie będzie jednolity. 0 ~ 67 wystąpi więcej niż 68 ~ 99, ponieważ 32767 MOD 100 = 67 .
Aby wygenerować jednolity rozkład losowy przy użyciu powyższego kodu, należy zmienić wartość 100 . Oto metoda uzyskania liczby, która tworzy jednolity rozkład.
32767 mod (32767 / n)
gdzie n jest liczbą całkowitą, od 0 do 32767, wynik może być dziesiętny i może nie działać wsadowo.
Jednolita dystrybucja
set /a result=(%RANDOM%*100/32768)+1
Ta metoda wygeneruje jednolity rozkład. Unika używania % , który bardziej przypomina „resztę” niż „moduł” w skrypcie wsadowym. Bez użycia % wynik będzie jednolity.
Alternatywnie, tutaj jest nieefektywna, ale jednolita metoda.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Zmień [yourMinNumber] i [yourMaxNumber] zgodnie z własnymi wartościami.