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



Teraz jest 23 gru 2024, o 18:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 23 lis 2013, o 22:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 maja 2013
Posty: 191
Pomógł: 2

Witam mam taki oto kod:
Kod:
void losowanie()
{
 liczba=random(0,5);   
}

ale niestety ciągle losuje mi te same liczby tzn. po resecie jest ta sama kolejność liczb. Wie ktoś może jak to zmienić.

A jeszcze lepiej gdyby wyrzucało wylosowaną liczbę i w kolejnym losowaniu nie uczestniczyła

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lis 2013, o 22:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8589
Pomógł: 337

http://arduino.cc/de/Reference/RandomSeed

tym się zainteresuj


Autor postu otrzymał pochwałę

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lis 2013, o 21:45 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 4
Pomógł: 0

A jeśli liczba nie ma uczestniczyć w kolejnym losowaniu, to wystarczy ją zapamiętać do następnego losowania.

Jeśli natomiast liczby mają się nie powtarzać dopóki się nie skończą, to trzeba zrobić tablicę jedynek odpowiedniego rozmiaru i potem losować aż trafimy na liczbę, dla której tablica[liczba]==1 i wstawiać tam zero by się nie powtórzyła (plus wstawiać od nowa jedynki, gdy liczby się skończą). Ten algorytm powinien być całkiem w porządku, jeśli liczb z których losujemy jest mało.
Jeśli natomiast jest ich dużo, to pod koniec będzie trudno trafić na taką, która jeszcze nie była wylosowana i wtedy trzeba by było raczej pamiętać w tablicy niewylosowane jeszcze liczby, po wylosowaniu usuwać i zmniejszać rozmiar tablicy i przedział, z jakiego losujemy indeks tablicy. Usuwanie liczby z tablicy nie musi być czasochłonne, można po prostu przestawić ostatnią na miejsce usuwanej i zmniejszyć "rozmiar" tablicy - przecież wcale nie muszą być po kolei.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2013, o 09:05 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 57
Pomógł: 5

wszystkie algorytmy losujące w systemach komputerowych są "pseudo" losowe - czyli nie tak do końca losowe
http://pl.wikipedia.org/wiki/Generator_liczb_pseudolosowych
jego działanie wymaga "zasiania ziarna" (seed) tak jak podał SunRiver. Wywołanie powinno być jednorazowe na początku działania programu.
na arduino.cc zanalazłem randomSeed(analogRead(0)); gdzie jako ziarno przyjmowana jest jakaś przypadkowa wartość z przetwornika ADC
czasami w różnych językach funkcje siejącą ziarno wywołuje się z argumentami związanymi z bierzącym czasem (dzień, miesiąc,godzina, minuta sekunda) aby przy każdym nowym uruchomieniu programu funkcja przyjnowała inną wartość


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2013, o 16:09 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

Nie do końca się zgodzę z tą pseudo-losowością. Bo jeśli jest wartość przypadkowa(!) np. z ADC no to chyba jest losowa?
Czyż nie?

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lis 2013, o 19:40 
Offline
Użytkownik

Dołączył(a): 05 lut 2013
Posty: 302
Pomógł: 19

Nie. Wytlumaczenie w wiki. Link powyzej. ;)

Wysłane z mojego GT-I9300 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lis 2013, o 02:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 758
Pomógł: 9

Ale gdy odczyt ADC nie jest ziarnem generatora, a samym wynikiem, to możemy mówić tu o prawdziwej losowości.
A w C++ fajnie się sprawdzało ziarno w postaci bieżącego czasu:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i potem zwykły rand() zwraca za każdym razem co innego, bo każde wywołanie programu następuje z innym ziarnem zależnym od czasu. A czasu odpalenia programu nie znamy a priori (wcześniej).

Co do odczytu z ADC to jednak można mieć pewne wątpliwości - czy on faktycznie jest losowy, tzn. ma rozkład jednostajny, czy pewne wartości nie są bardziej prawdopodobne od innych - trzeba by porobić testy i wykreślić histogram. Jednak myślę, że do końca losowe to to nie jest - przecież nawet przy pomiarze napięcia "niczego" coś to "nic" mierzy -> czy jeżeli "nic" jest mniej więcej stałe w czasie, to układ zwróci co innego za każdym razem ze swojego pełnego zakresu zmienności? Układ szaleje, zwraca różne wartości, ale jednak podejrzewam, że do rozkładu jednostajnego daleko.

Generator liczb prawdziwie losowych należałoby oprzeć nie o algorytmy, wzory, ale o zjawiska prawdziwie losowe - a takich trzeba szukać w przyrodzie (fizyka, chemia) - zjawiska zachodzące na poziomie atomów itp. Układ elektroniczny (jakim jest chociażby ADC) charakteryzuje się pewną przewidywalnością działania jednak...

_________________
ATB 1.03, Win XP SP3, ECLIPSE Indigo 3.7.2



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: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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