• 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
429 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 (251,210 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,440 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 (251,210 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 (155,460 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 (155,460 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 203 wizyt
0 głosów
0 odpowiedzi 367 wizyt
pytanie zadane 1 listopada 2020 w C i C++ przez Shakinti Nowicjusz (140 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...