ITBlog

IT Blog w tematach różnych...

  • O blogu…
  • Edukacja
    • Moodle – stare
    • Moodle2
    • Testy
    • Wykłady IT
  • Firma

Generator liczb (prawie) losowych – trandom.py

Napisane przez Igor Brzeżek on 15 czerwca 2026
Napisane w: Programowanie.

Contents
  1. trandom.py – wieloźródłowy generator liczb losowych
  2. Do czego służy trandom?
  3. Jak to działa – mechanizm wewnętrzny
  4. Wymagania
  5. Windows (bez zewnętrznych zależności)
  6. Linux / macOS
  7. Instalacja i uruchomienie
  8. Opcje wiersza poleceń – szczegółowy opis
  9. Tryby generowania (wyłączne, domyślnie: –int)
  10. Opcje wyjścia
  11. Opcje źródeł entropii
  12. Opcje informacyjne
  13. Przykłady użycia
  14. 1. Generowanie pojedynczej liczby losowej (domyślne)
  15. 2. Generowanie zestawu liczb do Lotto (6 z 49)
  16. 3. Generowanie 5 losowych liczb zmiennoprzecinkowych
  17. 4. Generowanie 32 losowych bajtów (256 bitów) jako hex
  18. 5. Zbieranie entropii myszy przez 10 sekund, potem losowa liczba
  19. 6. Zbieranie entropii klawiatury, potem 64 bajty
  20. 7. Połączenie entropii klawiatury + czujników
  21. 8. Losowy wybór z listy argumentów
  22. 9. Tasowanie elementów
  23. 10. Tasowanie linii ze stdin
  24. 11. Podgląd hex 256 losowych bajtów
  25. 12. Zapis wyniku do pliku
  26. 13. Generowanie 1000 liczb z paskiem postępu
  27. 14. Sondowanie dostępnych źródeł entropii
  28. Porównanie z wbudowanymi modułami Pythona
  29. Zatrzymywanie programu
  30. Podsumowanie

trandom.py – wieloźródłowy generator liczb losowych

trandom.py to generator liczb losowych (True Random Number Generator) napisany w Pythonie, który czerpie entropię z wielu źródeł sprzętowych i systemowych. W przeciwieństwie do generatorów pseudolosowych (Mersenne Twister, LCG) nie opiera się na deterministycznym algorytmie, lecz na fizycznym szumie pochodzącym z drżenia zegara CPU, fluktuacji czasów dostępu do dysku, wyścigów wątków, adresów alokacji pamięci, timingu sieciowego oraz systemowego CSPRNG. Opcjonalnie można dodać entropię z ruchów myszy, naciśnięć klawiszy i czujników sprzętowych (temperatura CPU, wentylatory, napięcia, bateria).

Program zbiera wszystkie źródła entropii, miesza je przez SHA3-512, a następnie SHA-256, dając na wyjściu równomiernie rozłożone dane losowe.

GitHub: github.com/IgorBrzezek/trandom

Do czego służy trandom?

Generator trandom znajduje zastosowanie wszędzie tam, gdzie potrzebna jest wysoka jakość losowości:

  • Losowania LOTTO i innych gier liczbowych – generowanie zestawów liczb w zadanych zakresach (np. 1-49 dla Lotto, 1-80 dla Keno).
  • Testy i symulacje – potrzeba nieprzewidywalnych danych wejściowych.
  • Kryptografia – generowanie kluczy, nonce, wektorów inicjalizacyjnych.
  • Edukacja i demonstracja – pokazanie, jak działa sprzętowe zbieranie entropii.
  • Bezpieczne tasowanie – tasowanie list, zestawów pytań, talii kart.
  • Generowanie haseł i tokenów – losowe ciągi bajtów.

Jak to działa – mechanizm wewnętrzny

trandom.py implementuje klasę TrueRandom, która na każde żądanie gather() próbkuje 7 zawsze aktywnych źródeł entropii:

  1. System CSPRNG – os.urandom() pobiera dane z kryptograficznie bezpiecznej puli systemu operacyjnego, która gromadzi entropię z przerwań sprzętowych, ruchów myszy, timingu klawiatury i innych zdarzeń systemowych.
  2. CPU Jitter – mierzy różnice czasu wykonania instrukcji z dokładnością nanosekund. Niewielkie obliczenia ([i**2 for i in range(30)]) wykonywane są w pętli, a różnice czasowe wynikające ze stanu potoku CPU, chybienia cache i zarządzania energią stanowią entropię.
  3. Disk Timing – odczytuje fragment pliku skryptu z precyzyjnym pomiarem czasu. Fluktuacje latencji odczytu wywołane buforowaniem dyskowym, stanem kontrolera i opóźnieniami mechanicznymi (lub wear-leveling w SSD) dostarczają entropii.
  4. Adresy pamięci – alokuje 200 obiektów Pythona w szybkiej sekwencji i zapisuje ich adresy (id()). Różnice w zachowaniu alokatora sterty i ASLR produkują entropię.
  5. Planiści wątków – uruchamia 4 wątki dokonujące pomiarów czasu ze wspólnym akumulatorem. Niedeterministyczne przeplatanie wątków przez system operacyjny wprowadza entropię z wyścigu (race condition).
  6. Network Timing – wysyła pojedynczy pakiet UDP na 8.8.8.8:53 i mierzy czas. Nawet jeśli wysyłka się nie powiedzie, sam czas wywołania systemowego ma jitter.
  7. Liczniki wydajności – zbiera 50 odczytów licznika wysokiej rozdzielczości (time.perf_counter_ns()). Wariacje na poziomie kwantowym pomiędzy kolejnymi odczytami są przechwytywane.

Opcjonalnie, po dodaniu odpowiednich flag, zbierane są dodatkowe źródła:

  • Ruchy myszy (--mouse) – odpytywanie pozycji kursora co 10 ms z rejestracją delta (dx, dy) i znacznikiem czasowym.
  • Naciśnięcia klawiszy (--keyboard) – odpytywanie klawiatury co 10 ms z zapisem kodu klawisza i timestampem. Wyłączne względem --mouse.
  • Czujniki sprzętowe (--sensors) – odczyt temperatury CPU, prędkości wentylatorów, napięć i stanu baterii przez bibliotekę psutil lub wmic (Windows).

Wszystkie zebrane dane są konkatenowane, haszowane przez SHA3-512 (64 bajty), a następnie przez SHA-256 (32 bajty). Taka kaskada haszująca zapewnia, że każdy pojedynczy bit entropii z dowolnego źródła wpływa na każdy bit wyjścia.

Wymagania

Windows (bez zewnętrznych zależności)

Wszystkie funkcje, za wyjątkiem czujników sprzętowych, działają bez instalowania dodatkowych pakietów. Śledzenie myszy wykorzystuje Win32 API przez ctypes (wbudowane). Śledzenie klawiatury korzysta z msvcrt (wbudowane).

Linux / macOS

  • Entropia myszy (--mouse) wymaga: pip install pynput
  • Entropia klawiatury (--keyboard) używa select na stdin (wbudowane, bez dodatkowych zależności).
  • Entropia czujników (--sensors) wymaga: pip install psutil

Instalacja i uruchomienie

Program to pojedynczy plik – nie wymaga instalacji. Wystarczy pobrać i uruchomić:

python trandom.py [opcje]

Opcjonalne pakiety:

pip install psutil
pip install pynput

Opcje wiersza poleceń – szczegółowy opis

Tryby generowania (wyłączne, domyślnie: –int)

Opcja Opis
--int Generuje losową liczbę całkowitą (domyślny tryb).
--float Generuje losową liczbę zmiennoprzecinkową w zakresie [0.0, 1.0).
--bytes N Generuje N losowych bajtów, wyświetla jako hex.
--hex [N] Wyświetla N losowych bajtów w formacie hexdump (domyślnie 256). Pokazuje offset, bajty hex i reprezentację ASCII.
--choice A B ... Losowo wybiera jeden element z podanych argumentów.
--shuffle Czyta linie ze stdin (lub argumentów), tasuje i wypisuje.

Opcje wyjścia

Opcja Opis Domyślnie
-n N Liczba wartości do wygenerowania 1
--min N Minimalna wartość dla --int 0
--max N Maksymalna wartość dla --int 2^32-1
-o FILE Zapis wyjścia do pliku zamiast stdout –

Opcje źródeł entropii

Opcja Opis
--mouse Zbiera entropię z ruchów myszy.
--keyboard Zbiera entropię z naciskanych klawiszy. Wyłączne z --mouse.
--sensors Zbiera entropię z czujników sprzętowych (CPU, wentylatory, napięcia).
--duration SEC Opcjonalny limit czasu dla zbierania myszy/klawiatury.
--samples N Docelowa liczba próbek myszy/klawiatury (domyślnie 250).

Opcje informacyjne

Opcja Opis
--list-sources, --probe Wykrywa i pokazuje wszystkie dostępne źródła entropii, a następnie kończy działanie.
-v, --verbose Wyświetla szczegółowe informacje o postępie zbierania i generowania.
--pb, --progressbar Pokazuje live pasek postępu podczas generowania wartości.

Przykłady użycia

1. Generowanie pojedynczej liczby losowej (domyślne)

python trandom.py

2. Generowanie zestawu liczb do Lotto (6 z 49)

python trandom.py --int --min 1 --max 49 -n 6

3. Generowanie 5 losowych liczb zmiennoprzecinkowych

python trandom.py --float -n 3

4. Generowanie 32 losowych bajtów (256 bitów) jako hex

python trandom.py --bytes 32

5. Zbieranie entropii myszy przez 10 sekund, potem losowa liczba

python trandom.py --mouse --int --duration 10

6. Zbieranie entropii klawiatury, potem 64 bajty

python trandom.py --keyboard --bytes 64

7. Połączenie entropii klawiatury + czujników

python trandom.py --keyboard --sensors --bytes 64 -v

8. Losowy wybór z listy argumentów

python trandom.py --choice apple banana cherry date

9. Tasowanie elementów

python trandom.py --shuffle jeden dwa trzy cztery pięć

10. Tasowanie linii ze stdin

echo -e "alfa\nbeta\ngamma" | python trandom.py --shuffle

11. Podgląd hex 256 losowych bajtów

python trandom.py --hex

12. Zapis wyniku do pliku

python trandom.py --bytes 32 -o losowe.hex

13. Generowanie 1000 liczb z paskiem postępu

python trandom.py --int --min 1 --max 49 -n 1000 --pb

14. Sondowanie dostępnych źródeł entropii

python trandom.py --list-sources
python trandom.py --probe

Porównanie z wbudowanymi modułami Pythona

Moduł Typ Źródło entropii Zastosowanie
random PRNG Mersenne Twister (deterministyczny) Symulacje, gry, testy
secrets CSPRNG os.urandom() Tokeny bezpieczeństwa, hasła
os.urandom CSPRNG Pula entropii jądra Kryptografia
trandom.py TRNG 7+ źródeł fizycznych mieszanych przez SHA3-512+SHA256 Demonstracja, edukacja, multi-entropia

Ważne: Do większości rzeczywistych zastosowań kryptograficznych wystarcza os.urandom() i moduł secrets. To narzędzie jest przeznaczone głównie do celów demonstracyjnych, edukacyjnych i eksperymentalnych, gdzie pożądane jest łączenie wielu niezależnych źródeł entropii.

Zatrzymywanie programu

Program działa w pętli aż do zakończenia zadania. W przypadku zbierania entropii myszy lub klawiatury bez limitu czasu, można go przerwać, naciskając Ctrl+C.

Podsumowanie

trandom.py to eleganckie narzędzie dla każdego, kto potrzebuje wysokiej jakości liczb losowych lub chce zrozumieć, jak działa zbieranie entropii ze źródeł fizycznych. Dzięki 7 zawsze aktywnym źródłom entropii i opcjonalnym rozszerzeniom (mysz, klawiatura, czujniki) program dostarcza dane losowe o bardzo dobrej jakości. Wbudowany tryb --probe pozwala sprawdzić, jakie źródła entropii są dostępne na danej platformie, a elastyczne opcje generowania (liczby całkowite, zmiennoprzecinkowe, bajty, hex, wybór, tasowanie) czynią go uniwersalnym narzędziem.

Szczególnie przydatny jest w kontekście losowań liczb – wystarczy podać zakres i ilość, aby otrzymać gotowy zestaw do gry. Można go użyć np. do wygenerowania 6 liczb z zakresu 1-49 (Lotto), 5 z 50 (EuroJackpot) czy dowolnego innego wariantu.

Źródła: github.com/IgorBrzezek/trandom

Nawigacja

← Generator LOTTO i różne statystyki
Generator plików WAV →
  • Szukaj

  • Kategorie

    • IT ogólnie (147)
      • Bezpieczeństwo (19)
        • Model AAA (7)
        • Szyfrowanie (1)
      • CCTV (3)
      • Hardware (2)
      • Podstawy informatyki (1)
      • Sieci (35)
        • Cisco (4)
          • Obsługa haseł (2)
        • MikroTik (8)
        • Pomiary w sieciach LAN (6)
          • iptraf-ng (3)
        • Protokół ARP (5)
        • Symulator sieci GNS3 (3)
        • WLAN / WiFi (5)
      • Software (78)
        • Bazy danych (13)
        • Programowanie (21)
        • Systemy operacyjne (21)
          • Linux Debian (18)
        • Windows (8)
      • WiFi (2)
      • Wirtualizacja (26)
  • Ostatnie wpisy

    • WinScreen czyli terminal z wirtualnymi oknami
    • Style Mover czyli przenoszenie stylów HTML
    • Generator obrazów AI za pomocą API
    • Generator modulacji AM i FM
    • Generator plików tekstowych i binarnych
  • Strona odwiedzona

    od 11.01.2013

  • Doskonała platforma e-learningowa Uzyskaj certyfikat IT

Proudly powered by WordPress Theme: Parament by Automattic.
7ads6x98y