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: #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. |
|
Savail |
» 2011-07-07 13:54:57 Jak wykasujesz tą linijkę: srand( time( NULL ) ); to będzie wszystko w porządku ^^. |
|
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 |
|
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 |
|
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;
#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. |
|
DejaVu |
» 2011-07-07 14:33:00 Ale tą funkcję trzeba wstawić na początku programu, a nie w pętli ( srand). |
|
Prefix |
» 2011-07-07 20:40:55 Zamiast w pętli wstaw tak: #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: 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 ;) |
|
« 1 » |