Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Losowość funkcji losującej

Ostatnio zmodyfikowano 2013-07-13 20:17
Autor Wiadomość
ciekawski
Temat założony przez niniejszego użytkownika
Losowość funkcji losującej
» 2013-07-13 16:43:47
Witam wszystkich,

czytam troszkę o tych funkcjach losowych i wyczytałem, że sama funkcja rand() jest pseudo losowa bla bla bla... i żeby mieć "pełną" losowość musimy dodać zmienne "ziarno".
Tak więc wstawiamy funkcje srand(), która korzysta z czasu liczonego od jakiejś tam daty bla bla bla...

Ale do sedna.

Czy losowość tej funkcji jest naprawdę taka losowa?

Pisze prosty programik losujący liczbę z zakresu od 1 do 10000 oraz zapętliłem aby pytał czy losujemy jeszcze raz.Powtarzam losowanie 3 razy na sekundę i się rozczarowuję :/ . Pomimo iż spodziewałem się dużej rozbieżności w wylosowanych wynikach to program zwraca mi np  5143  5147 5150 5154...  Na każdą upływającą sekundę dodaje 3 albo 4 do poprzedniego wyniku.



I gdzie ta losowość?
P-87759
pekfos
» 2013-07-13 17:50:15
rand() to generator liczb pseudolosowych (i do tego niezbyt dobry). Jeśli chcesz lepszej losowości, użyj lepszego generatora (np jednego z oferowanych przez bibliotekę standardową C++11)
P-87769
m4tx
» 2013-07-13 18:13:47
rand() to generator liczb pseudolosowych
Tak jak każdy oferowany przez komputer. Rzecz w tym, że mając do dyspozycji tylko CPU nie da się stworzyć generatora liczb losowych. Dla pełnej losowości trzeba by było użyć sprzętowego generatora szumu co jest zazwyczaj niemożliwe. Są, niemniej jednak, generatory, które generują tak dobre liczby, że ciężko odróżnić je od prawdziwej losowości. Wciąż są to jednak generatory liczb pseudolosowych...

@ciekawski - jeśli wywołujesz
srand()
 wiele razy (przy każdym losowaniu) to spróbuj wywołać tylko raz, przed pierwszym losowaniem. Powinno, myślę, pomóc.
P-87771
pekfos
» 2013-07-13 18:27:50
Tak jak każdy oferowany przez komputer.
Napisałem to głównie po to, by podkreślić te "pseudo". Btw, widziałem kiedyś taki sprzętowy generator na PCI, więc też się to może zaliczać do komputera ;>
P-87772
jsc
» 2013-07-13 18:45:23
Jak taki sprzęt działa?
P-87774
Mrovqa
» 2013-07-13 18:47:27
Jeżeli chcesz mieć liczby losowe, to potrzebujesz jakiegoś losowego czynnika, którym, no niestety, nie jest aktualny czas. Możesz wykorzystać randa bazowanego na tym czasie, ale wykonaj na nim kilka operacji z innymi losowymi wartościami, jak np. pozycja kursora myszki czy aktualna temperatura procesora (warto rozważyć wzięcie szybko zmieniającej się części, tj. np. liczba jedności i część po przecinku).

/edit: @jsc pobiera szumy z otoczenia (temperatura, fale elektromagnetyczne, może coś jeszcze innego) i na podstawie tych losowych z punktu widzenia komputera wartości generuje jakieś liczby.

/edit2: Dodam, iż do spraw niezwiązanych z bezpieczeństwem wystarczy zwykły pseudolosowy generator liczb, chyba, że nie jesteś zadowolony z rozkładu. Silniki liczb pseudolosowych w bibliotece standardowej C++11 oferują wybrany rozkład losowości.
P-87775
m4tx
» 2013-07-13 19:29:20
Btw, widziałem kiedyś taki sprzętowy generator na PCI, więc też się to może zaliczać do komputera ;>
No ok, źle się trochę wyraziłem - rzecz jasna miałem na myśli sam CPU bez dodatku innych bajerów, I/O, etc ;> Zresztą, o sprzętowym generatorze szumu/liczb losowych to i ja pisałem, więc... :)
P-87787
ciekawski
Temat założony przez niniejszego użytkownika
» 2013-07-13 20:17:18
@m4tx - rzeczywiście wywołując funkcję srand() tylko 1 raz jestem mile zaskoczony działaniem programu.

Dzięki wielkie za pomoc :)
P-87792
« 1 »
  Strona 1 z 1