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

[Kurs C++, Lekcja 19] Wylosowane liczby są takie same

Ostatnio zmodyfikowano 2011-07-07 20:40
Autor Wiadomość
snuffy
Temat założony przez niniejszego użytkownika
[Kurs C++, Lekcja 19] Wylosowane liczby są takie same
» 2011-07-07 13:38:23
Witam. Otóż mam problemy w powyższym zadaniem.
Napisz program, który wylosuje 999 liczb całkowitych z zakresu od 4 do 10 włącznie, wypisze te wartości na ekran, po czym zsumuje je i wynik wypisze na ekran. Wszelkie operacje mają zostać zrealizowane w oparciu o funkcje. Tablica ma być zadeklarowana w funkcji main. Oczekiwane funkcje:
Wypełnienie tablicy o podanym rozmiarze losowymi liczbami z przedziału podawanego przez argumenty funkcji.
Sumowanie określonej ilości liczb znajdujących się w tablicy i zwrot wyniku.
Wypisywanie zawartości tablicy.
Wymyśliłem coś takiego:
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
void wylosujLiczby( int x[], int m, int y, int z )
{
    int b;
    int k = 0;
    b = z - y;
    do
    {
        srand( time( NULL ) );
        x[ m ] =(( rand() % b ) + y );
        m--;
    } while( m != 0 );
   
}

void wypiszLiczby( int x[], int m )
{
    int k = 0;
    std::cout << "Liczby : " << std::endl;
    do
    {
        std::cout << x[ m ] << ", ";
        m--;
    } while( m != 0 );
   
}

int obliczSume( int x[], int m )
{
    int suma = 0;
    int k = 0;
    do
    {
        suma += x[ m ];
        m--;
    } while( m != 0 );
   
    return suma;
}

int main()
{
    int tablica[ 999 ];
    wylosujLiczby( tablica, 999, 4, 10 );
    wypiszLiczby( tablica, 999 );
    int iSuma = obliczSume( tablica, 999 );
    std::cout << "Suma liczb wynosi: " << iSuma << std::endl;
    return 0;
}
Niby wszystko dobrze - udało się skompilować. Program wylosował liczbe z danego przedziału jednak wszystkie 999 sa takie same. Dodam że suma rownież się zgadza. Może mnie ktoś naprowadzić na błąd ? Coś z funkcją rand()? Z góry dzięki za pomoc. Pozdrawiam.
P-35464
Savail
» 2011-07-07 13:54:57
Jak wykasujesz tą linijkę:
srand( time( NULL ) );
 to będzie wszystko w porządku ^^.
P-35466
snuffy
Temat założony przez niniejszego użytkownika
» 2011-07-07 14:01:25
Działa dzięki :D A mógłbyś to jakoś wyjaśnić? :P O ile dobrze zrozumiłem ten dział o losowaniu liczb to właśnie bez tej linijki powinno się tak dziać. Bez tego wylosowywana jest zawsze taka sama liczba - tzn wg mojego rozumowania ktore jak przypuszczam jest błędne :P
P-35467
Savail
» 2011-07-07 14:08:14
Szczerze mówiąc to sam się zdziwiłem :D. Może to jakis problem z funkcją time(); Przy każdym przejściu pętli powinna ona zwracać różne wartości bo zwraca ona miniony czas od rozpoczecia programu jesli dobrze pamietam i dlatego niby właśnie ona nadaje się idealnie do generowania ziarna... Możesz stworzyć jakąś zmienną int i w pętli przypisywać dla niej wartość funkcji time() i wyswietlac na ekran. Sprawdz czy wyniki beda takie same, jesli tak tzn ze to wina funkcji time() a jesli nie... to moze jakis bardziej doswiadczony uzytkownik ci pomoze :P
P-35468
snuffy
Temat założony przez niniejszego użytkownika
» 2011-07-07 14:23:19
Hmm no i zrobiłem ten test, napisałem coś takiego;
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
    int a;
    do {
        srand( time( NULL ) );
        a = rand();
        cout << "liczba : " << a << endl;
    } while( a != 0 );
   
    return 0;
}
Oczywiście program wypisuje liczby i nie konczy sie. Widać że liczba zmienia się dokładnie co sekunde. Natomiast bez tej linijki
srand(time (NULL))
liczba zmienia się z każdym przejściem pętli. Troche tego nie rozumiem, bo to własnie dzieki tej funkcji liczby miały być inne.
P-35469
DejaVu
» 2011-07-07 14:33:00
Ale tą funkcję trzeba wstawić na początku programu, a nie w pętli (» standard Csrand).
P-35470
Prefix
» 2011-07-07 20:40:55
Zamiast w pętli wstaw tak:

C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
void wylosujLiczby( int x[], int m, int y, int z )
{
    srand( time( NULL ) );
   
    int b;
    int k = 0;
    b = z - y;
    do
    {
        x[ m ] =(( rand() % b ) + y );
        m--;
    } while( m != 0 );
   
}

I ciesz się dobrze zrobionym zadaniem ;D.

Chociaż ja tą funkcję zrobiłem tak:

C/C++
void wylosujLiczby( int tablica[], int ile, int a, int b )
{
    srand( time( NULL ) );
    int licznik = 0;
    b = b - 5;
    do
    {
        tablica[ licznik ] =( rand() % b ) + a;
        licznik++;
    } while( ile > licznik );
   

Wg. mnie czytelniej ;)
P-35503
« 1 »
  Strona 1 z 1