Instrkce na libovolné číslo??

Pro správný random generátor by měly být splněny nasledující požadavky:

  1. 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ů.
  2. Generování nesmí být periodické. Žádná větší posloupnost čísel se nesmí opakovat.
  3. Žádná další hodnota z generátoru nesmí být předvídatelná.
  4. 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.