 | Jarin's 08.08.2019 20:07 Bydliště: Za dveřmi je Rak
|
| 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.... |
|