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 wybiera N 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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow