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 /a
instrukcja generuje losową liczbęN
od 1 do 26 - Instrukcja
for /f
wybieraN
ty 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.