Najmniejsza i najwieksza liczba wylosowana z przedzialu od 1-100

0

Prosze o pomoc, program wyswietla maxymalna liczbe, dlaczego nie chce mi wyswietlic najmniejszej liczby z posrod 5 wylosowanych? z gory dzieki.

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <math.h>

using namespace std;

int mn, mx, suma=0,liczba,srednia;
int main()
{
    cout << "WItaj, z 5 wylosowanych liczb z przedzialu 1-100 program podaje najmniejsza," << endl;
    cout << "najwieksza oraz oblicza ich srednia" << endl;


    srand(time(NULL));


    for( int i=1;i<=5;i++)
    {

        liczba=rand()%99+1;
        cout<<liczba<<",";
        suma=suma+liczba;

        if(liczba>mx)
        {mx=liczba;}


        if(liczba<mn)
        {mn=liczba;}

    }

    cout<<"Suma tych liczb to: "<<suma<<endl;
    srednia=suma/5;
    cout<<"srednia tych liczb to: "<< srednia<<endl;
    cout<<"Maximum to:"<<mx<<" a minimum to :"<<mn <<" .";

    return 0;
}
4

int mn

globalna zmienna typu int, czyli masz zero initialization -> ustawia mn na 0

liczba=rand()%99+1;

rand() co prawda zwraca inta, ale od 0 do RAND_MAX

if(liczba<mn)

skoro liczba jest od 1 do 99, a mn jest 0, ten warunek nigdy się nie spełni

Rozwiązanie:
inicializuj mn np std::numeric_limits<int>::max()

EDIT
Tak na przyszłość: pogódź się z debuggerem ;)

0

Dzieki wielkie za pomoc :)

2
liczba=rand()%99+1;

Ten kod nie losuje wartości 1 - 100.

0

Faktycznie, dzieki ze zwrociles uwage, chyba powinno byc: liczba=rand()%100+1.

0

Dzieki :)

0
Tenonymous napisał(a):

Od siebie dodam:
https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

Tytuł artykułu jest zwodniczy. Powinien brzmieć:

Nie używaj rand(), C++ ma thread_local std::mt19937 gen{std::random_device{}()}; template<typename T> T random(T min, T max) { return std::uniform_int_distribution<T>{min, max}(gen); }.

Jasne. Dzięki. Bardzo czytelne.

Tak naprawdę jeśli nie piszemy kodu kryptograficznego czy czegoś tego typu, zwykły stary rand jest wystarczający, nie trzeba zaśmiecać kodu jakimiś uniform_int_distribution ani magic constant w samej nazwie klasy.

2

Oczywiście. int tab = new int[5] to też bardziej zwięzły i zrozumiały zapis niż deklaracja Vectora.
Random też nie jest idealny, ale na pewno lepszy i nie ma podstawowych błędów jakie ma Rand.

5

To porównanie jest nieuczciwe.

thread_local std::mt19937 gen{std::random_device{}()};
// vs
srand(time(NULL)); // w ogóle nie było wzięte pod uwagę

Jedno i drugie zawiera części nieczytelne, i dla typowego przypadku zbędne, ale wersja pierwsza przynajmniej gwarantuje poprawność w wielowątkowości i powtarzalność wyników.

template<typename T>
T random(T min, T max) {
    return std::uniform_int_distribution<T>{min, max}(gen);
}

Powinno być traktowane jak funkcja biblioteczna, choć nie zgadzam się, że jest to jakaś niesamowicie trudna do zrozumienia funkcja. Istotne jest jednak użycie dalsze. Jak chcesz znaleźć losowe liczby z przedziałów [100,110], [150,159] i [201, 225]?

random(100, 110);
random(150, 159);
random(201, 225);
// vs
rand() % 11 + 100;
rand() % 10 + 150;
rand() % 25 + 201;

Tutaj próba obrony randa urąga tutaj inteligencji czytającego. Pomijając jakąkolwiek poprawność statystyczno-kryptograficzną, rand() to wylęgarnia błędów off-by-one (albo i milion), szczególnie u początkujących.

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