Rozumná otázka vyžaduje rozumnou odpověď: Předně, testování náhodnosti je nezbytností pro každého, kdo tvoří generátor náhodných čísel – ať už pro účely šifrování, či pro statistický výzkum. Tím samozřejmě neskončíme – podle míry náhodnosti můžete například usoudit například, zda (a jak hodně) je možné teoreticky zkomprimovat soubor, aniž byste to zkoušeli skutečně provádět. S výsledky takového zkoumání bude rozumné porovnat účinnost kompresního algoritmu, který právě vyvíjíte či používáte. Zkoumáním entropie poznáte, jak hodně plýtvají místem různé datové formáty. A hlavně – užijete si při tom spoustu zábavy ;-)
Testy
Ve všech těchto případech vám přijde vhod pseudorandom number sequence test, zkráceně ENT. Program provádí rozličné testy souboru udaného jako parametr anebo datového proudu, který do něj nasměrujete ze standardního vstupu. Dozvíte se především tyto informace:
Entropie
Vyjadřuje informační hustotu souboru v bitech na znak. Čím vyšších hodnot dosahuje, tím je soubor informačně hustší. Hodnoty pro komprimované soubory (téměř maximálně husté, téměř náhodný vzorek) se blíží 8, naopak entropie psaného textu se může pohybovat okolo 5.
Možnost komprese
Udává, o kolik procent bude soubor menší, pokud se optimálně zkomprimuje. Vychází se přitom z testu entropie. Počítá se zde s kousky dat o velikosti jednoho bytu, výsledky je proto třeba brát s rezervou – algoritmy pracující s většími rámci (např. LZW) mohou dosahovat lepších výsledků, pokud jsou v datech opakující se sekvence více bytů.
Chí kvadrát test dobré shody
Důležitý statistický test, používá se k porovnání dvou rozdělení. Ta mohou být zadána nějakým vzorcem anebo sadou konkrétních hodnot – takovému rozdělení se pak říká empirické. Vlastní testování v našem případě zahrnuje stanovení navazujících disjunktních intervalů empirického rozdělení (testovaných dat) a posčítání četností v těchto intervalech. Dále se zjistí teoretické četnosti (podle předpokládaného tvaru rozdělení) v každém z intervalů. Z rozdílů četností se nakonec odvodí testové kritérium, na základě kterého se může (porovnáním s hodnotou chí kvadrát rozdělení) rozhodnout o náhodnosti. Do detailů zabíhat nebudeme, pokud vás téma zajímá, můžete sáhnout po leckteré učebnici statistiky.
Test se používá leckde a pro leccos, mimo jiné pro testování kvality řad pseudonáhodných čísel, a je vysoce citlivý na různé běžné neduhy. Program zjistí absolutní hodnotu testu a pro srozumitelnost dopočítá, jak často by tuto hodnotu překročila skutečně náhodná data. Výsledek můžeme interpretovat jako určitý stupeň nenáhodnosti. Hodnota pro náhodná data by se měla pohybovat co nejblíže středu rozsahu, tedy kolem 50 % Jak již ale bylo řečeno, test je to docela citlivý, a tak je i oblast pravděpodobné náhodnosti dosti široká. Tabulka shrnuje, jak by měly být chápány různé výsledky:
Výsledek testu v % | Interpretace – náhodnost dat |
---|---|
0 - 1 % | téměř jistě nenáhodná |
1 - 5 % | podezředlá (asi nenáhodná) |
5 - 10 % | trochu podezřelá (možná nenáhodná) |
10 - 90 % | pravděpodobně náhodná data |
90 - 95 % | trochu podezřelá (možná nenáhodná) |
95 - 99 % | podezředlá (asi nenáhodná) |
99 - 100 % | téměř jistě nenáhodná |
Test dobré shody odhalí mnohé takové zdroje a typy nenáhodnosti, na které například test entropie nestačí. Jak píše autor projektu, je jím možné odhalit nedostatečnost mnoha běžně používaných generátorů. Například standardní Unixová rand()
funkce dosahuje velice hanebných hodnot – výsledek testu pro 500000 vzorků je 0,01. Náhodná data by tuto hodnotu překročila v 99,99 procentech případů, a je tedy naprosto nepřijatelná pro seriózní použití. Vylepšený generátor (Park & Miller) dosahuje hodnot o poznání lepších – testové kritérium je 212,53 a náhodný vzorek by překročil tuto hodnotu „pouze“ v 95 % případů, ovšem i to je mnohdy nedostatečné. Mnohem lepších výsledků (237,05 a 75 %) dosahuje například sada náhodných čísel HotBits. Tato čísla ale již nejsou počítačově generovaná pseudonáhodná čísla, ale skutečná, ryzí náhodná čísla „generovaná“ kvantovými procesy při radioaktivním rozpadu na subatomární úrovni. Více viz odkazy na konci článku.
Aritmetický průměr
Jednoduchá charakteristika – všechny byty (popř. bity při parametru -b) jsou sečteny a vyděleny jejich počtem v souboru. Průměr bytů úplně náhodného, dostatečně velkého vzorku dat je logicky 127,5 a průměr bitů je analogicky 0,5. Tímto testem zjistíte, zda jsou hodnoty v celém souboru spíše vysoké nebo nízké.
Hodnota Monte Carlo pro π
Každá po sobě jdoucí sekvence šesti bytů je interpretována jako 24bitové X a Y souřadnice čtverce. Pokud jsou vzdálenosti náhodně generovaného bodu menší než poloměr kružnice vepsané čtverci, považuje se tato sekvence za „zásah“. Z procenta zásahů se spočítá hodnota π. Pro opravdu velké soubory dat se takto spočítaná hodnota bude blížit skutečnému π, je-li soubor náhodný. Pro vzorek 32768 bytů již zmíněných náhodných čísel získaných pozorováním radioaktivního rozpadu vychází 3,139648438, tedy chyba 0.06 procent.
Hodnota koeficientu seriální korelace
Měří, jak hodně každý byte závisí na bytu předchozím. Pro náhodné sekvence se tato hodnota blíží nule, pokud data nejsou náhodná, může nabýt kladné či záporné hodnoty. Nenáhodné vzorky (například psaný text) dosahují hodnot kolem 0,5. Opravdu hodně předpověditelná data – nekomprimované bitmapy, text typu „aaaaaaabbbbbbaaaaaa“ a podobné se blíží hodnotě 1.
Co program neumí
ENT pár užitečných testů provede, ovšem pro definitivní přijetí či zatracení dat by stálo za to zkusit ještě některé další. Chybí mi především testy, které by odhalily konkrétní problémy – test extrémních bodů, test znamének diferencí (hledá nežádoucí trendy), test pořadové korelace (zda např. na začátku nejsou velké a na konci malé hodnoty), test seriální korelace (zda nejsou souvislosti například mezi sousedními čísly) a možná některé další.
Používání
Program ELF je klasicky řádkový, nemá žádné grafické rozhraní. Vstupní data můžete specifikovat uvedením jména souboru jako argumentu, popřípadě klasicky přesměrovat vstup. Výstup směřuje vždy na standardní výstup, pro zaznamenání výsledku do souboru se tedy přesměrování nevyhnete.
Parametr | Význam |
---|---|
-b | považuje vstup za bity a nikoliv za 8bitové byty |
-c | tiskne navíc tabulku počtů výskytů všech hodnot a jejich podíl na celkové velikosti souboru |
-f | před testováním převede velká písmena na malá |
-t | strohý výstup, hodnoty oddělené čárkami, vhodné pro import výsledků do tabulky, databáze či pro jiné počítačové zpracování |
-u | nápověda |
Program je pod public domain open source licencí k dispozici na domovské stránce jako zip archiv. Ten obsahuje zdrojový kód v C++, Makefile
pro kompilaci pod Unixem a pro vyšší pohodlí uživatelů systémů DOS a Windows (kteří asi nejsou zvyklí běžně si programy kompilovat) spustitelný exe
soubor. Většinu informací pro článek jsem čerpal rovněž odtamtud.
Odkazy a použitá literatura
- Domovská stránka
- Balíček pro Debian/unstable
- HotBits
- Základní informace o rozdělení chí-kvadrát
- Skalská, H.: Stochastické modelování. Skriptum. Gaudeamus, 1998
- Antoch, J., Vorlíčková, D.: Vybrané metody statistické analýzy dat. Praha, Academia 1992
- Rubinstein, R.Y.: Simulation and the Monte Carlo Method. New York, Wiley, 1981
Příloha: Ukázkový výstup
Tak takhle nějak vypadá výsledek testu náhodnosti tohoto článku (s parametrem -c pro statistiku jednotlivých znaků):
Value Char Occurrences Fraction 9 387 0.031162 10 303 0.024398 13 303 0.024398 32 1160 0.093405 33 ! 2 0.000161 34 " 102 0.008213 37 % 41 0.003301 38 & 29 0.002335 40 ( 21 0.001691 41 ) 23 0.001852 42 * 4 0.000322 43 + 2 0.000161 44 , 72 0.005798 45 - 56 0.004509 46 . 91 0.007327 47 / 179 0.014413 48 0 77 0.006200 49 1 38 0.003060 50 2 21 0.001691 51 3 28 0.002255 52 4 21 0.001691 53 5 35 0.002818 54 6 3 0.000242 55 7 6 0.000483 56 8 11 0.000886 57 9 32 0.002577 58 : 40 0.003221 59 ; 35 0.002818 60 < 313 0.025203 61 = 111 0.008938 62 > 313 0.025203 64 @ 1 0.000081 65 A 90 0.007247 66 B 21 0.001691 67 C 44 0.003543 68 D 125 0.010065 69 E 104 0.008374 70 F 23 0.001852 71 G 30 0.002416 72 H 98 0.007891 73 I 74 0.005959 74 J 5 0.000403 75 K 2 0.000161 76 L 83 0.006683 77 M 25 0.002013 78 N 75 0.006039 79 O 59 0.004751 80 P 151 0.012159 81 Q 1 0.000081 82 R 68 0.005475 83 S 41 0.003301 84 T 239 0.019245 85 U 10 0.000805 86 V 42 0.003382 87 W 39 0.003140 88 X 1 0.000081 89 Y 38 0.003060 90 Z 11 0.000886 95 _ 1 0.000081 97 a 463 0.037282 98 b 151 0.012159 99 c 173 0.013930 100 d 330 0.026572 101 e 533 0.042918 102 f 22 0.001771 103 g 50 0.004026 104 h 211 0.016990 105 i 276 0.022224 106 j 103 0.008294 107 k 213 0.017151 108 l 184 0.014816 109 m 270 0.021741 110 n 497 0.040019 111 o 662 0.053305 112 p 228 0.018359 113 q 9 0.000725 114 r 300 0.024157 115 s 323 0.026009 116 t 530 0.042677 117 u 220 0.017715 118 v 203 0.016346 119 w 13 0.001047 120 x 9 0.000725 121 y 109 0.008777 122 z 111 0.008938 123 { 1 0.000081 125 } 1 0.000081 154 32 0.002577 157 2 0.000161 158 56 0.004509 200 Č 1 0.000081 225 á 169 0.013608 232 č 69 0.005556 233 é 88 0.007086 236 ě 81 0.006522 237 í 191 0.015380 239 ď 2 0.000161 242 ň 1 0.000081 243 ó 2 0.000161 248 ř 63 0.005073 249 ů 41 0.003301 250 ú 5 0.000403 253 ý 61 0.004912 Total: 12419 1.000000 Entropy = 5.661359 bits per byte. Optimum compression would reduce the size of this 12419 byte file by 29 percent. Chi square distribution for 12419 samples is 80262.42, and randomly would exceed this value 0.01 percent of the times. Arithmetic mean value of data bytes is 90.2712 (127.5 = random). Monte Carlo value for Pi is 3.717738038 (error 18.34 percent). Serial correlation coefficient is 0.277645 (totally uncorrelated = 0.0).
Článek na 99,99 % není náhodný shluk písmen, což mě potěšilo…:-)