• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pojawiające się "0" przy pseudo losowaniu liczby

Object Storage Arubacloud
0 głosów
587 wizyt
pytanie zadane 4 lipca 2017 w C i C++ przez Krystian_n Nowicjusz (170 p.)

Treść zadania : 

  • Napisz funkcję, która losuje liczbę z przedziału od 50 do 60 włącznie. Wywołaj funkcję kilka razy (wypisz wylosowane wartości na ekran) w celu przetestowania czy działa ona poprawnie.
  • Mój KOD : 

    #include <iostream>
    #include <time.h>
    #include <cstdlib>
    int losowanie()
    {
        int ile;
        std::cin>>ile;

        srand( time( NULL ) );

        while(ile)
        {
            std::cout<<rand()%10+50<<std::endl;
            ile--;
        }

    }

    int main()
    {

        std::cout<<"Podaj ile razy chcesz losowac liczbe : ";
        int wynik=losowanie();
        std::cout<<wynik;


        return 0;
    }
     

  • Problem polega na tym że przy losowaniu np 3 liczb na końcu pojawia sie "0" nie mam pojęcia dlaczego, próbowałem juz zmieniać KOD na różne sposoby ale nic z tego jedynie raz zero zmieniło się na 1 ale to nadal nie rozwiązuje problemu, Proszę o radę :) 

6 odpowiedzi

+1 głos
odpowiedź 4 lipca 2017 przez draghan VIP (106,230 p.)
wybrane 4 lipca 2017 przez Krystian_n
 
Najlepsza

Uwaga porządkowa: kod źródłowy wstawiamy w bloczek "code" (ostatni przycisk w edytorze).

Twoja funkcja losowanie() zwraca wartość int, którą później wypisujesz w linii std::cout<<wynik;. W swoim kodzie w ogóle nie uwzględniasz zwracania wartości z funkcji losowanie. Najpierw dopisz tam:

int losowanie() 
{ 
    int ile; 
    std::cin>>ile;

    srand( time( NULL ) );

    while(ile) 
    { 
        std::cout<<rand()%10+50<<std::endl; 
        ile--; 
    }
    return 9000;
}

i sprawdź, co otrzymujesz. :) Potem zmień sygnaturę rzeczonej funkcji tak, żeby zwracała void i usuń tego returna oraz wypisanie. I sprawdź co otrzymujesz. :)

komentarz 4 lipca 2017 przez Krystian_n Nowicjusz (170 p.)
Dziękuję bardzo, faktycznie nie zauważyłem braku return  poprawiłem na void i wszystko działa :)
komentarz 5 lipca 2017 przez criss Mędrzec (172,590 p.)
I wyrzuć sranda z funkcji losującej (przerzuć do maina) :P Inicjalizacja seeda przy każdym wywołaniu zdecydowanie mija się z celem.
komentarz 6 lipca 2017 przez draghan VIP (106,230 p.)

I wyrzuć sranda z funkcji losującej (przerzuć do maina) :P Inicjalizacja seeda przy każdym wywołaniu zdecydowanie mija się z celem.

Criss, zauważ że mamy tutaj tylko jedno wywołanie funkcji losowanie().

komentarz 6 lipca 2017 przez criss Mędrzec (172,590 p.)
Anyway "brzydkie programistycznie" :P
komentarz 6 lipca 2017 przez draghan VIP (106,230 p.)
Kolega Krystian_n się jeszcze wyrobi. :)
komentarz 6 lipca 2017 przez criss Mędrzec (172,590 p.)
Po prostu nie można z góry zakładać, że funkcja zostanie wywołana raz i tym bazować reszte kodu. Każdy się wyrobi, ale tylko wtedy jak będzie się mu wskazywać błędy :)
+1 głos
odpowiedź 4 lipca 2017 przez mokrowski Mędrzec (155,460 p.)

Napisz funkcję, która losuje liczbę z przedziału od 50 do 60 włącznie. Wywołaj funkcję kilka razy (wypisz wylosowane wartości na ekran) w celu przetestowania czy działa ona poprawnie.

Jakiego więc ma typu być wartość zwracana? Typu int czy unsigned int ? :-)

Inną sprawą jest użycie bardzo już przestarzałej, tworzącej błędy i niezalecanej od 2011 metody losowania. Obecnie do losowania liczb z podanego zakresu używa się nagłówka <random> oraz odpowiednich funkcji rozkładu. U Ciebie będzie to rozkład równomierny http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution

Jeśli jednak powinieneś upierać się w metodzie "z srand() i rand()", to pętlę przenieś do main() bo losowanie() ma zwrócić po 1 wywołaniu 1 liczbę.Wtedy wywołanie srand(NULL), powinno pojawić się także w main() bo inicjalizację tego generatora przeprowadzasz 1 raz.

Zmień nagłówek <time.h> na <ctime> oraz informuję Cię że w C++ nie ma obowiązku zwracania na końcu main() zera. Kompilator robi to sam (ale pamiętaj że tylko main() ma taką "magiczną właściwość" :-)) 

Dodatkowo przemyśl co się stanie jeśli zamiast podania ilości wywołań zostanie wprowadzony np. napis lub liczba ujemna :-)

0 głosów
odpowiedź 4 lipca 2017 przez Knayder Nałogowiec (37,640 p.)
Co według ciebie zwraca funkcja losowanie()?
Bo to właśnie wypisujesz na ekran: std::cout << wynik;
0 głosów
odpowiedź 4 lipca 2017 przez jpacanowski VIP (101,940 p.)
edycja 4 sierpnia 2017 przez jpacanowski
Przecież funkcja losowanie() nic nie zwraca (brak return), a tylko wyświetla wylosowaną liczbę. Potem wyświetlasz wartość zmiennej wynik, która jest zerem (żadna wartość z funkcji losowanie() nie jest przypisywana, gdyż funkcja nic nie zwraca).

Ogólnie jeśli nie użyjemy w funkcji instrukcji return, wartość zwracana będzie przypadkowa (dostaniemy śmieci z pamięci).
0 głosów
odpowiedź 5 lipca 2017 przez Mski Nowicjusz (160 p.)
Dodatkowo zakres liczb losowanych jest od 50 do 59.

std::cout<<rand()%11+50<<std::endl;

Teraz jest dobry zakres
–1 głos
odpowiedź 4 lipca 2017 przez fkwilczek Nowicjusz (240 p.)

zrobienie  z funkcji losowanie() voida i zamienienie tego kawałka kodu

int wynik=losowanie(); 
    std::cout<<wynik;

na ten 

losowanie(); 

powinno pomóc

Podobne pytania

0 głosów
1 odpowiedź 146 wizyt
0 głosów
1 odpowiedź 160 wizyt
0 głosów
1 odpowiedź 3,340 wizyt
pytanie zadane 5 stycznia 2017 w C i C++ przez Deleteuser Użytkownik (500 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...