Liczby Pseudolosowe

0

Witam,
Mam problem z liczbami pseudolosowanymi. Otóż mam wylosować liczby z przedziału <-7;10> i następnie odszukać największą liczbę z tego przedziału. Problem polega na tym, że albo za każdym razem kompilator losuje te same liczby i podaje zły "max". Oto moj kod:

 
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wartoscLosowa() {
    srand(time(0));
    //rand()%(10-(-7)+1)+(-7);
    return (rand() % 18 ) + (-7);
}

void wypelnianieTablicy(int tablica[]) {
    for(int i = 0; i <= 19; i++){
        tablica[i] = wartoscLosowa();
    }
}

//3
int elementMax(int tablica[]) {
    int element_max = tablica[0];

    for(int i = 0; i <= 19; i++){
        if(tablica[i] >= element_max){
            element_max = tablica[i];
        }
    }
    return element_max;
}

int main(){
    int tabA[20];

    for(int i = 0; i<=19; i++){
        wypelnianieTablicy(tabA);
        cout << "Tab["<< i + 1 << "] = " << tabA[i] << endl;
    }

    cout << "Elemen Max tablicy: " <<  elementMax(tabA) << endl; 

Proszę o pomoc!

1

Za każdym wywołaniem funkcji wartoscLosowa seedujesz wartość rand tą samą¹ wartością. Nic dziwnego, że masz takie wyniki, srand używa się raz na działanie programu.

Swoją drogą używaj <random> zamiast rand(), którego design ma już kilkadziesiąt lat i nie przetrwał próby czasu. https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful

¹ w danym uruchomieniu programu, chyba, że program działa znaczący ułamek sekundy i wywołania będą w różnych sekundach.

0

Niestety jestem zmuszony do użycia funkcji rand(). Czy mółgbyś mi powiedzieć co powinienem zmienić aby ten program działał poprawinie? Muszę przenieść srand() w inne miejsce w kodzie?

0

Dodam jeszcze, że po usunięciu srand(), program losuje liczby poprawnie, ale max dalej pozostaje błędny. Czemu po pozbyciu sie srand() program zaczął losować liczby prawidłowo?

1

Max nie jest błędny. 20 razy losujesz po 20 liczb, wyświetlasz tylko 20 z tych 400.

Po pozbyciu się srand przestałeś ustawiać na siłę seeda pseudolosowego w dokładnie tę samą wartość przed każdym losowaniem. Kompletne pozbycie się tej funkcji też jest złe - powinieneś wywołać ją raz.

0

Dobra, poradziłem sobie. Połączyłem dwie funcje i teraz działa poprawnie:

 void wypelnianieTablicy(int tablica[]) {
    srand(time(0));
    
    for(int i = 0; i <= 19; i++){
        tablica[i] = rand()%(10-(-7)+1)+(-7);;
    }
}

Dziękuje za pomoc!

0

Teraz przykryłeś błąd i dostajesz oczekiwane wyniki, ale zauważ, że 20x odpalasz funkcję wypełnianieTablicy (co w ogóle ludzie mają z tymi odrzeczownikowymi formami?)

    for(int i = 0; i<=19; i++){
        wypelnianieTablicy(tabA);
        cout << "Tab["<< i + 1 << "] = " << tabA[i] << endl;
    }
 
0

"drzeczownikowymi formami" - możesz sprecyzować?

wypelnianieTablicy(tabA);
for(int i = 0; i<=19; i++){
    cout << "Tab["<< i + 1 << "] = " << tabA[i] << endl;
} 
0

A to o to chodzi. Robie tek z przyzywczajenia, ale muszę się tego pozbyć i przestawić na język angielski.

0

Dziękuje jesszcze raz za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1