Generator liczb Lotto w Batch – skrypt do losowania 6 unikalnych liczb 1-49 Windows CMD

Pytanie

napisz generator liczb lotto w batchu

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Poniżej znajduje się kompletny skrypt Batch generujący 6 unikalnych liczb z zakresu 1-49 (klasyczne Lotto).
  • Skrypt jest parametryzowalny, więc jednym poleceniem można go dostosować do Mini Lotto, Eurojackpot czy Multi Multi.
@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

Kluczowe punkty

  • %RANDOM% dostarcza liczb 0-32767 – wynik skalujemy: … %% ZAKRES + 1.
  • Unikalność zapewnia „tablica” uzyta[i].
  • EnableDelayedExpansion jest niezbędne do poprawnego odświeżania zmiennych w pętli.
  • Parametry u góry pozwalają generować dowolną loterię bez przepisywania kodu.

Szczegółowa analiza problemu

  1. 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 \]

  2. 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).

  3. Sterowanie parametrami

    • ILE_LICZB – liczba losowań w jednym koszyku
    • ZAKRES_DO – górna granica zakresu
    • ZESTAWY – liczba koszyków (np. 5 kuponów na jednym wydruku)
  4. 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.

  5. Przykłady konfiguracji
    • Mini Lotto ILE_LICZB=5, ZAKRES_DO=42
    • Multi Multi (20/80) ILE_LICZB=20, ZAKRES_DO=80
    • Eurojackpot

    • Główne: ILE_LICZB=5, ZAKRES_DO=50
    • Gwiazdki: ILE_LICZB=2, ZAKRES_DO=12 (wywołać :LosujZestaw drugi raz z innymi parametrami)

Aktualne informacje i trendy

  • 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.


Wspierające wyjaśnienia i detale

  • „Modulo bias”: jeśli 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.
  • Zmienna wynik przechowuje ciąg z pojedynczą spacją na początku; ułatwia to wyszukiwanie findstr /c:" num " bez fałszywych trafień (np. „1” ≠ „11”).

Aspekty etyczne i prawne

  • Generator ma charakter rozrywkowy; nie zwiększa szans w rzeczywistej loterii.
  • W Polsce gry liczbowe są regulowane przez Ustawę o grach hazardowych – prawdziwe losowania prowadzi wyłącznie Totalizator Sportowy.
  • Przechowywanie i udostępnianie list z typowaniami nie budzi ryzyka RODO, o ile nie zawierają danych osobowych.

Praktyczne wskazówki

  1. Zapisz kod jako generator_lotto.bat (typ pliku: „Wszystkie pliki”).
  2. Uruchom podwójnym kliknięciem lub poleceniem cmd /c generator_lotto.bat.
  3. Aby wydrukować kilka kuponów naraz – ustaw ZESTAWY na pożądaną liczbę.
  4. Jeżeli potrzebujesz pełnej automatyzacji (np. generowane kupony do .csv) – pipe’uj wynik:
    generator_lotto.bat > kupony.csv
  5. Do testów statystycznych (tysiące losowań) użyj PowerShell/Python – Batch jest wolny w dużych pętlach.

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • %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.
  • Bubble-sort w Batch ma złożoność O(n²); dla 20 liczb Multi Multi trwa zauważalnie długo (ok. 150 ms).
  • Jeśli planujesz dystrybucję skryptu poza PL, usuń CHCP 65001 lub dodaj go, aby uniknąć „krzaczków”.

Sugestie dalszych badań

  • Migracja do PowerShell (Get-Random -Minimum 1 -Maximum 50 -Count 6) – szybsze i lepszy RNG.
  • Integracja z API Totalizatora (REST/JSON), by pobierać rzeczywiste wyniki i analizować statystyki.
  • Zastosowanie kryptograficznego RNG (CryptGenRandom, BCryptGenRandom) wywoływanego z Batch przez powershell -Command ….
  • Analiza dystrybuanty: sprawdzenie, na ile %RANDOM% spełnia testy NIST SP 800-22; ewentualnie implementacja LFSR lub XorShift w czystym Batch.

Krótkie podsumowanie

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.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.