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

Generowanie liczby losowej w petli while

VPS Starter Arubacloud
+2 głosów
593 wizyt
pytanie zadane 31 sierpnia 2021 w C i C++ przez FMateusz90 Nowicjusz (180 p.)

Cześć,

  Ucząc się z Blogu Pana Mirosława staram się trochę przeinaczać zadania przez niego robione, żeby nie przeklepywać kodu z filmików na YT. Próbuję zrobić prostą pętle, która będzie losować liczbe z zakresu 1...1000 i będzie się powtarzać dopóki wylosowana liczba nie będzie mniejsza od 20. Kod wygląda tak:

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>
using namespace std;
int liczba;
int main()
{
    cout << "Hello world! Bede losowal 1..1000";
    cout << " do momentu az wylosuje mniejsza niz 20"<< endl ;
    srand(time(NULL));
        while(liczba>=20)
    {

        liczba=rand()%1000+1;
        if (liczba<=1000)
        cout << liczba;

        else
        cout<< "kolejna proba"<<endl;
    }

    return 0;

Próbowałem na 50 sposobów i nie wiem czy mam tu jakiś błąd logiczny, którego nie widzę, czy po prostu z braku wiedzy coś robię źle.

komentarz 31 sierpnia 2021 przez VBService Ekspert (255,800 p.)

Moim zdaniem ten warunek

        if (liczba<=1000)
        cout << liczba;
 
        else
        cout<< "kolejna proba"<<endl;

skoro losujesz liczby 1..1000 kod po else nigdy się nie wykona

spróbuj może

        liczba = rand() % 1000 + 1;
        cout << liczba << endl;
        
        if (liczba > 20)
           cout << "kolejna proba" << endl;

 

4 odpowiedzi

+3 głosów
odpowiedź 31 sierpnia 2021 przez tonn204 Mądrala (7,470 p.)

Moim zdaniem problem leży w tym, że jak sam napisałeś w kodzie liczby będą się losowały do momentu aż będą większe niż liczba 20. U ciebie zmienna "liczba" domyślnie z racji na to, że jest zmienną globalną zainicjowana jest zerem przez co pętla się nigdy nie wykona. Musisz po prostu przed pętlą while dokonać pierwszego losowania liczby i powinno wszystko działać.

 

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>

using namespace std;

int liczba;

int main()
{
    cout << "Hello world! Bede losowal 1..1000";
    cout << " do momentu az wylosuje mniejsza niz 20"<< endl ;
    
    srand(time(NULL));
    
    liczba=rand()%1000+1;
    
    while(liczba>=20)
    {
 
        liczba=rand()%1000+1;
        if (liczba<=1000)
            cout << liczba << endl;
        else
            cout<< "kolejna proba"<<endl;
    }
    
}

 

komentarz 1 września 2021 przez FMateusz90 Nowicjusz (180 p.)
Rzeczywiście, to grzebało cały program. Dzięki za pomoc!
+2 głosów
odpowiedź 31 sierpnia 2021 przez dziablo Użytkownik (940 p.)
Hej, przy pierwszym sprawdzaniu warunku pętli while liczba jest chyba niezainicjalizowana(globalne zmienne są chyba inicjalizowane do 0, nie pamiętam :)), przypisz jej np. 20. Albo zrób z tego pętlę do while.

Popracuj nad formatowaniem kodu while jest wcięte za bardzo, a couty pod if else w ogóle.
komentarz 1 września 2021 przez FMateusz90 Nowicjusz (180 p.)

Jak próbowałem go jakoś ratować to tak namieszałem, że w końcu całość musiałem napisać jeszcze raz z uwzględnieniem Waszych rad. Generalnie tamten kod był pisany na szybko, ale rzeczywiście może lepiej nie zaczynać od złych nawyków. Będę nad tym pracował, a finalnie działająca wersja wygląda tak:

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>
using namespace std;
int liczba, proba;
int main()
{

     cout << "Losujmy, az trafimy liczbe mniejsza niz 20"<< endl;
    srand(time(NULL));
    liczba=rand()%1000+1;
     cout<< liczba << endl;
        while(liczba>=20)
   {
    liczba=rand()%1000+1;
    proba++;
     cout << "proba nr " <<proba<<". "<< liczba;

        if (liczba<=20)
     cout << " Graty! wylosowana liczba to " << liczba<< endl;

        else
     cout << " Niestety " << liczba << " to za duza liczba. Losujemy dalej"<< endl;


   }

   getchar();



    return 0;
}

 

1
komentarz 1 września 2021 przez VBService Ekspert (255,800 p.)

Jak już napisał @tonn204

Albo zrób z tego pętlę do while.

uprości nieco kod, np.:

#include <iostream>
#include <time.h>
#include <cstdlib>
#include <stdio.h>

using namespace std;

int main()
{
    int liczba=0, proba=0;
    srand(time(NULL));
    
    cout << "Losujmy, az trafimy liczbe mniejsza niz 20" << endl;

    do    
    {
        liczba=rand()%1000+1;
        cout << "proba nr " << ++proba << ". " << liczba;
 
        if (liczba<=20)
            cout << " Graty! wylosowana liczba to " << liczba << endl;
        else
            cout << " Niestety " << liczba << " to za duza liczba. Losujemy dalej" << endl;
            
    } while (liczba>=20);
 
    getchar();
    return 0;
}

 

+1 głos
odpowiedź 1 września 2021 przez mokrowski Mędrzec (156,260 p.)

Hmm...

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

using namespace std;

int main() {
    cout << "Hello world! Bede losowal 1..1000"
    	<< " do momentu az wylosuje mniejsza niz 20\n";
    srand(time(NULL));
    for(int liczba = rand() % 1000 + 1; liczba >= 20; liczba = rand() % 1000 + 1) {
        cout << liczba << '\n';
    }
}

 

komentarz 2 września 2021 przez FMateusz90 Nowicjusz (180 p.)
Wow, wersja mega skrócona, ale mankamentem jest że nie wypluwa ostatniej liczby (tzn. tej mniejszej od 20).
komentarz 2 września 2021 przez mokrowski Mędrzec (156,260 p.)

Poprawka łatwa...

#include <iostream>
#include <ctime>
#include <cstdlib>
 
using namespace std;
 
int main() {
    cout << "Hello world! Bede losowal 1..1000"
        << " do momentu az wylosuje mniejsza niz 20\n";
    srand(time(NULL));
    int liczba;
    for(liczba = rand() % 1000 + 1; liczba >= 20; liczba = rand() % 1000 + 1) {
        cout << liczba << '\n';
    }
    cout << liczba << '\n';
}

Poza tym można oczywiście tak:

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

using namespace std;

int main() {
    cout << "Hello world! Bede losowal 1..1000"
    	<< " do momentu az wylosuje mniejsza niz 20\n";
    srand(time(NULL));
    int liczba;
    do {
        liczba = rand() % 1000 + 1;
        cout << liczba << '\n';
    } while(liczba >= 20);
}

Czy tak:

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

using namespace std;

int main() {
    cout << "Hello world! Bede losowal 1..1000"
    	<< " do momentu az wylosuje mniejsza niz 20\n";
    srand(time(NULL));
    for(;;) {
        int liczba;
        liczba = rand() % 1000 + 1;
        cout << liczba << '\n';
        if(liczba < 20) {
        	break;
        }
    }
}

.. i jeszcze pewnie kilka egzotycznych...

Choć tego ostatniego bym nie bronił...

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

using namespace std;

int main() {
    cout << "Hello world! Bede losowal 1..1000"
    	<< " do momentu az wylosuje mniejsza niz 20\n";
    srand(time(NULL));
    int liczba;
    for( ;
    	liczba = rand() % 1000 + 1,
    	cout << liczba << '\n',
    	liczba >= 20;
    	liczba = rand() % 1000 + 1) {
    }
}

 

0 głosów
odpowiedź 1 września 2021 przez FMateusz90 Nowicjusz (180 p.)
Rzeczywiście, bład poprawiony.

Podobne pytania

0 głosów
0 odpowiedzi 223 wizyt
0 głosów
0 odpowiedzi 416 wizyt
pytanie zadane 1 listopada 2020 w C i C++ przez Shakinti Nowicjusz (140 p.)

92,977 zapytań

141,940 odpowiedzi

321,182 komentarzy

62,303 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...