Najmniejsza i najwieksza liczba wylosowana z przedzialu od 1-100

Odpowiedz Nowy wątek
2018-11-09 01:18
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;
}
edytowany 1x, ostatnio: furious programming, 2018-11-09 01:51

Pozostało 580 znaków

2018-11-09 01:37
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 ;)

edytowany 6x, ostatnio: stryku, 2018-11-09 08:05

Pozostało 580 znaków

2018-11-09 03:30
0

Dzieki wielkie za pomoc :)

Pozostało 580 znaków

2018-11-09 08:43
liczba=rand()%99+1;

Ten kod nie losuje wartości 1 - 100.


Nie pisz na priv. Zadaj dobre pytanie na forum.

Pozostało 580 znaków

2018-11-09 22:11
0

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

Pozostało 580 znaków

2018-11-09 22:44
2018-11-15 23:47
0

Dzieki :)

Pozostało 580 znaków

2018-11-16 08:58
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"> 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.

edytowany 2x, ostatnio: Azarien, 2018-11-16 09:00
Też z artykułu (z czym się zgadzam): "PS: żadna z tych metod nie nadaje się do kryptografii." - enedil 2018-11-16 13:51

Pozostało 580 znaków

2018-11-16 12:48
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.


Pozostało 580 znaków

2018-11-16 13:14
kq
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.


Rozumiem rzekome zalety używania mt-cośtam-cośtam nad srand+rand, ale składnia jest potworna, rozwlekła i zawiera magic value w nazwie klasy. Tragedia. - Azarien 2018-11-28 09:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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