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

liczby pseudolosowe - jak to działa?

Ostatnio zmodyfikowano 2011-11-15 22:04
Autor Wiadomość
markon
Temat założony przez niniejszego użytkownika
liczby pseudolosowe - jak to działa?
» 2011-11-15 21:41:47
Witam,
w jaki sposób działa funkcja rand i srand w C++ ?
Interesuje mnie strona czysto teoretyczna.
pozdrawiam
P-44131
akwes
» 2011-11-15 22:04:37
Pisałem o tym nie raz na forum, jakbyś poszukał to byś znalazł na pewno :P


srand inicjuje start algorytmu losującego, który sobie tam określa jakieś różne przejścia. Oczywiście w tym jest ZERO losowości, są to liczby z góry PRZEWIDZIANE przez algorytm co więcej przy takiej samej danej wejściowej są do odtworzenia.

rand() natomiast zwraca kosmicznie dużą liczbę (zdaje się że z pogranicza integera). Dlatego używamy do tego modulo.

Nie wiem co konkretnie Cię interesuje bo to dość duży temat :P

// edit1

C/C++
#include <iostream>
#include <stdlib.h>
#include <conio.h>

using namespace std;

int main()
{
    srand( 44 ); // "a imę jego 44"
    for( int i = 0; i < 100; i++ )
    {
        cout << rand() % 40;
    }
    getch();
}

Mimo użytego poprawnie srand(int) losują się te same liczby, gdyż dana wejściowa jest taka sama za każdym uruchomieniem programu. A że algorytm jest ten sam (ta sama funkcja) to musi iść w niezmienny sposób (bo algorytm się nie zmienia).

// edit2
C/C++
#include <iostream>
#include <stdlib.h>
#include <conio.h>

using namespace std;

int main()
{
    for( int i = 0; i < 100; i++ )
    {
        srand( 44 ); // "a imę jego 44" 
        cout << rand() % 40;
    }
    getch();
}
oraz
C/C++
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

using namespace std;

int main()
{
    for( int i = 0; i < 100; i++ )
    {
        srand( time( NULL ) );
        cout << rand() % 40;
    }
    getch();
}
Złe użycie srand(int). Dlatego że w teraz za każdym razem będzie wypisywana ta sama liczba. Dlaczego? Algorytm będzie się zatrzymywał cały czas na pierwszym kroku (bo cały czas inicjujemy algorytm od nowa). 100 obiegów pętli trwa na tyle krótko że nawet funkcja time(NULL) nie zdąży zwrócić innego wyniku (ze względu na swoją dokładność czasową).
P-44132
« 1 »
  Strona 1 z 1