napisz generator liczb lotto w batchu
@echo off & setlocal EnableDelayedExpansion
rem ======= PARAMETRY =========================================================
set "ILE_LICZB=6" rem ile liczb w zestawie (np. 5 dla Mini-Lotto)
set "ZAKRES_DO=49" rem maksymalna wartość (np. 42 dla Mini-Lotto)
set "ZESTAWY=1" rem ile zestawów chcesz wygenerować
rem ===========================================================================
for /L %%z in (1,1,%ZESTAWY%) do (
call :LosujZestaw
)
endlocal & goto :eof
:LosujZestaw
rem --- wyzerowanie struktur pomocniczych ------------------------------------
set "licznik=0"
set "wynik="
for /L %%i in (1,1,%ZAKRES_DO%) do set "uzyta[%%i]="
rem --- właściwe losowanie -----------------------------------------------------
:petla
if !licznik! geq %ILE_LICZB% goto :drukuj
set /a rand=!random! %% %ZAKRES_DO% + 1
if not defined uzyta[!rand!] (
set "uzyta[!rand!]=1"
set "wynik=!wynik! !rand!"
set /a licznik+=1
)
goto :petla
:drukuj
rem Proste (nieoptymalne) sortowanie bąbelkowe – opcjonalnie usuń, by zostawić kolejność losowania
for %%a in (!wynik!) do (
for %%b in (!wynik!) do (
if %%a lss %%b (
set "wynik=!wynik: %%a = %%b %%a =!"
)
)
)
echo Zestaw:!wynik!
goto :eof
%RANDOM%
dostarcza liczb 0-32767 – wynik skalujemy: … %% ZAKRES + 1
.uzyta[i]
.EnableDelayedExpansion
jest niezbędne do poprawnego odświeżania zmiennych w pętli.Mechanizm pseudo-losowy w Batch
Zmienna %RANDOM%
to 15-bitowy LCG (linear congruential generator). Choć nie jest kryptograficznie bezpieczny, wystarcza do symulacji gry liczbowej.
Losowanie w zakresie ⟨1;N⟩
osiągamy przez:
\[
L = (\text{RANDOM} \bmod N) + 1
\]
Unikalność wyników
Batch nie oferuje tablic. Symulujemy je poprzez dynamiczne zmienne środowiskowe:
set "uzyta[25]=1"
if defined uzyta[25] -> liczba już padła
Operacja IF NOT DEFINED
jest O(1), więc całość jest wydajna (dla 20–80 liczb praktycznie natychmiastowa).
Sterowanie parametrami
Sortowanie (opcjonalne)
W czystym Batch sortowanie jest kosztowne. Pokazany, minimalistyczny „bubble-sort” ułatwia czytelność wyniku, lecz można go pominąć, jeśli kolejność nie gra roli.
Przykłady konfiguracji
• Mini Lotto ILE_LICZB=5
, ZAKRES_DO=42
• Multi Multi (20/80) ILE_LICZB=20
, ZAKRES_DO=80
• Eurojackpot
ILE_LICZB=5
, ZAKRES_DO=50
ILE_LICZB=2
, ZAKRES_DO=12
(wywołać :LosujZestaw drugi raz z innymi parametrami)Windows 10/11 udostępnia konsolowe narzędzie certutil -generateSSTFromWU
lub certutil -hashfile
, które przy okazji pracują z CryptoAPI. Można je wykorzystać jako źródło silniejszych losów, np.:
for /f "skip=1" %%h in ('certutil -v -hashfile "%windir%\notepad.exe" MD5 ^| findstr /r "[0-9A-F][0-9A-F]"') do (
set /a rand=0x%%h %% 49 + 1
)
Pozwala to ominąć ograniczenia %RANDOM%
.
Coraz częściej do automatyzacji w środowisku Windows używa się PowerShell; tam dostępny jest silny RNG (Get-Random
) bazujący na CAPI‐CryptGenRandom.
32768
nie jest wielokrotnością N
, niektóre liczby mają minimalnie większe prawdopodobieństwo wylosowania. Dla Lotto (N = 49) odchyłka wynosi < 0,03 %, co w praktyce jest pomijalne. EnableDelayedExpansion
musi być włączony przed pierwszą pętlą; inaczej %RANDOM%
zostanie rozwinięty raz na etapie parsowania, co da statyczny wynik. wynik
przechowuje ciąg z pojedynczą spacją na początku; ułatwia to wyszukiwanie findstr /c:" num "
bez fałszywych trafień (np. „1” ≠ „11”).generator_lotto.bat
(typ pliku: „Wszystkie pliki”). cmd /c generator_lotto.bat
. ZESTAWY
na pożądaną liczbę. generator_lotto.bat > kupony.csv
%RANDOM%
resetuje się przy każdym uruchomieniu procesu CMD – sekwencje mogą się powtarzać między sesjami; jeśli to problem, warto „zasiać” RNG np. przez kilka losowań odrzuconych na starcie. CHCP 65001
lub dodaj go, aby uniknąć „krzaczków”.Get-Random -Minimum 1 -Maximum 50 -Count 6
) – szybsze i lepszy RNG. CryptGenRandom
, BCryptGenRandom
) wywoływanego z Batch przez powershell -Command …
. %RANDOM%
spełnia testy NIST SP 800-22; ewentualnie implementacja LFSR lub XorShift w czystym Batch. Przedstawiony skrypt Batch realizuje kompletny generator 6 unikalnych liczb 1-49 i może zostać parametrycznie dostosowany do dowolnej loterii. Kluczem jest wykorzystanie %RANDOM%
, tablicy zmiennych uzyta[i]
oraz opóźnionego rozwijania. Choć Batch ma ograniczenia jakości losowości i wydajności, dla celów hobbystycznych oferuje w pełni działające rozwiązanie. W przypadku wymagań produkcyjnych lub analitycznych warto przejść na PowerShell lub inny język z silniejszym RNG i bogatszymi strukturami danych.