Hlavní přehled   |   Info a nápověda Přihlásit   |   Registrovat
 
 
Příspěvek umístěný v tematickém vlákně:    Arduino, mikrokontroléry, mikropočítače   (str. 3)
 
Jarin's   
08.08.2019 20:07
Bydliště: Za dveřmi je Rak
948 141 910 
  Adam napsal(a):    A skutečně... Napsal jsem program, který mi vygeneroval jedno náhodné číslo za druhým a všechna v intervalu 0-10. Budu-li průběžně provádět výpočet jejich průměrné hodnoty, dle zákonitostí náhody by se mi...

Ahoj, Tvoje peripetie s generátorem náhody jsou zcela jasné. Tento problém mají úplně všechny implementace C a C++. Jde o to, že generátor je sice inicializován náhodným číslem z nedefinovaného analog vstupu viz:
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}


ale následně je už počítána stále se stejně opakující sekvence v implementaci algoritmu.
Pokud chceš tedy v C či C++ generovat opravdu náhodu, musíš vždy před samotnou generací inicializovat randomizer do jiného počátečního stavu .
Jde o to, že inicializace je volána pouze jednou na startu programu.
Pokud funkci
randomSeed(analogRead(0));
přehodíš do smyčky Loop()
bude generátor inicializován náhodným číslem pokaždé před generováním čísla.
Potom budeš po každém generování náhody opět generovat náhodu.

void loop() {
randomSeed(analogRead(0))
randNumber = random(300);
Serial.println(randNumber);
delay(50);
}

Je zde však ještě jeden možný zádrhel a to sice, že analogová hodnota na vstupu bude za jistých okolností dlouhodobě stabilní, např. vytahovací odpor na plus nebo zem či cosik jiného na daném vstupu.
100% jistotu, že generátor začne pokaždé jinde budeš mít pokud použiješ funkci micros()
vrací počet mikrosekund od startu arduina. Samozřejmě že i ulong(datový typ v arduinu 32bit) jednou přeteče a pojede to znovu, ale jen ta inicializace. Protože Loop() nikdy netrvá stejnou dobu (kecají do toho některá přerušení) bude to vždy naprosto jiné číslo pro inicializaci randomizeru.

100% RANDOM

void loop() {
randomSeed(micros());
randNumber = random(300);
Serial.println(randNumber);
delay(50);
}

Hodně štěstí při pokusech....
Zvláštní ocenění za úsilí nebo přínosPozitivní ohlasyOznačit příspěvek
  Přejít na příspěvek do vlákna      

 
 
Omforum.cz   |   Nápověda   |   Pravidla fóra   |   Podpořte chod fóra   |   Vytvořil: 2015-2026 Adam Benda
 
 
CC BY-NC-ND 3.0 CZ
Licence Creative Commons
Toto dílo podléhá licenci Creative Commons Uveďte původ-Neužívejte komerčně-Nezpracovávejte 3.0 Česká republika License