Pro správný random generátor by měly být splněny nasledující požadavky:
- Pravděpodobnost výskytu každého generovaného čísla ze zvoleného intervalu musí být stejná při nekonečném množsví vzorků.
- Generování nesmí být periodické. Žádná větší posloupnost čísel se nesmí opakovat.
- Žádná další hodnota z generátoru nesmí být předvídatelná.
- Dvě stejná zařízení se stejným SW nesmí generovat stejnou posloupnost čísel.
Jinými slovy, random generátor se musí chovat jako zdroj bílého šumu.(obsahuje všechny fekvence se stejnou amplitudou).
Kupříkladu funkce:
Y(t) = sin(at) + sin(bt)
kde t je čas a a a b jsou reálná čísla nemající celý společný násobek je neperiodická. Zdálo by se, že to lze pro random gen. použít, ale nespňuje podmínky 3 a 4.
Aby to fungovalo, musí být do výpočtu zavlečen jistý fyzikální jev, jež je jedinečný pro to které zařízení. Už zde bylo vzpomenuto měření teploty nebo šumu z ADC.
Napadlo mě docela jednoduché řešení vycházející z výše uvedené funkce. Není třeba počítat siny, ale stačí vzít 2 nezávislé frekvence, které přirozeně budou nesoudělné. Jejich součet by dal neperiodický signál. Jednou frekvencí může být krystal MCU a druhou frekvencí sít nebo RTC.
Pak stačí spustit 1 timer, jehož inkrementování je odvozeno od krystalu MCU a druhá frekvence generuje přerušení např. od síťové frekvence. V přerušení se odečte okamžitý stav timeru. Takto získané vzorky mohou posloužit jako parametry nějaké funkce či polynomu pro výpočet náhodného čísla.
V jednoduším případě lze vytvořit přerušení od timeru v pravidelných časových intervalech a přečíst si v něm hodnotu PC registru, což je vlastně návratová adresa v zásobníku. Protože k přerušení může docházet v libovolné části programu, získáme tak posloupnost pseudonáhodných čísel ale jen tehdy, není-li hlavní program nějak synchronizován s tímto timerem.