Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 11 sty 2025, o 19:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 10 sty 2014, o 01:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 paź 2013
Posty: 62
Pomógł: 2

Robię sobie ustrojstwo, w którym wymagana jest dość porządna pseudolosowość.
Oczywiście kombinowałem z losowością odczytując na LCD szum z niepodpiętego pinu przez ADC. Ale zakres tych liczb był owszem losowy, ale w dość wąskim zakresie. Dopiero jak długim kablem ów pin podłaczyłem do karnisza to zakres zrobił się satysfakcjonujący :lol: Generatora szumu nie chcę wstawiać. Więc stwierdziłem, że pseudolosowość przełknę, ale pod warunkiem ustawienia funkcji srand().

Więc wymyśliłem, że z tego ADC odczytuje sobie szum ... tyle, że na m88. Robię sobie szumową losową zmienną RND, po czym wstawiam ją do funkcji srand.
czyli:
Odpalam ADC
Robię pomiar szumu z ADC i zapisuję do zmiennej RND
Zmienną RND wstawiam do funkcji SRAND o tak: srand(RND);
Wyłączam ADC, żeby procka nie obciążać ciągłym próbkowaniem i zaczynam program główny.

Ale właśnie nie wiem czy raz tak ustawiona funkcja srand na początku programu będzie aktywna dla wszystkich użyć rand() od momentu jej ustawienia do wyłączenia uC ? Czy przed każdym użyciem rand() należałoby zmieniać ziarno srand()?

:roll:



Ostatnio edytowano 10 sty 2014, o 11:38 przez rescue1, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 11:08 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Rzeczywiście ADC to słaby generator liczb losowych, ktoś nawet zadał sobie trud by to zbadać: http://skemman.is/stream/get/1946/10689/25845/1/ardrand.pdf. Ale są inne pomysły (rozwiązanie sprzętowe): http://robseward.com/misc/RNG2/ dyskutowany i zmodyfikowany w tym wątku: http://forum.arduino.cc/index.php?PHPSESSID=7vekl4daen17sdkr04fe9k3mr7&topic=77695.msg780712#msg780712. Tu z kolei mądre głowy wyjaśniają dlaczego zastosowanie niepodłączonego pinu cyfrowego nie jest dobre do generowania: http://electronics.stackexchange.com/questions/50476/random-number-generators-using-a-gpio-pin
Ciekawy i dosyć obiecujący pomysł oparty na watchdogu tutaj: http://forum.arduino.cc/index.php?PHPSESSID=aplvfr7mrevjm19r872atjssk5&topic=77695.msg780627#msg780627.
Pewnie wszystko to już znasz, więc zamieszczam to tylko dla porządku ;-)
Aha, co do postawionego pytania: nie mam pojęcia ;-)


Autor postu otrzymał pochwałę

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 sty 2014, o 11:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 paź 2013
Posty: 62
Pomógł: 2

Aż zmieniłem tytuł posta ;)

Znam te publikacje. Póki co wychodzi, ze bez dodatkowego układu ciężko samym avr`em coś zdziałać.
Dlatego kombinuję, żeby chociaż te kiepskie do wykorzystania dane z ADC były seedami w srand(). Da mi to bardzo małe prawdopodobieństwo, że po kolejnym włączeniu procka będą się generować takie same liczby. Oczywiście jest to możliwe, bo może się zdarzyć, ze seed zostanie "zasiany" wartością z ADC, która się powtórzyła. Ale prawdopodobieństwo jest małe.
Nic to. Popróbuje jeszcze. Jak efekty będą mizerne to trzeba będzie jednak parę elementów dołączyć i zbudować jakiś generator.

A może ktoś tutaj już bawił się losowością w avr i ma jakiś ciekawe patenty?

EDIT:

Znalazłem info, że raz wywołane srand() jest ziarnem dla wszystkich wywołań rand() od jego ustawienia po wyłączenie mikrokontrolera.
Nie ma to jak samemu sobie odpowiadać. :lol:
Na marginesie powiem, że zrobienie właśnie losowego srand() na samym początku programu (a na pewno przed wywołaniem pierwszy raz funkcji rand() ) faktycznie działa. Właśnie to sprawdzam empirycznie i za każdym włączeniem procka powtórek brak. Czyli chyba działa ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 mar 2014, o 10:42 
Offline
Nowy

Dołączył(a): 16 mar 2014
Posty: 1
Pomógł: 0

Witam, też jakiś czas temu miałem taki problem i rozwiązałem go w następujący sposób:
Zczytywałem ADC z niepodpiętego pinu, co dawało jakąś wartość.

dzielenie całkowite przez dwa daje mi zero albo jedynkę, łącząc kilka takich pomiarów, których różnica w czasie była generowana przez funkcję losowania z poziomu programu, dało mi ciąg znaków w postaci binarnej.
Następnie zamiana na dziesiętny i po kilkuset próbach liczby wydają się dosyć losowe

Sam pomiar, dzielenie modulo przez dwa i wyswietlanie na ekranie 0 lub 1 wygląda na losowe, zatem liczby generowane w ten sposób tym bardziej.

(drugi sposób który testowałem to podłączenie potencjometru do pinu odczytującego ADC, rezultaty też były zadowalające)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 5 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO