Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcje - Zadanie domowe

Ostatnio zmodyfikowano 2014-07-18 21:54
Autor Wiadomość
Daedra
Temat założony przez niniejszego użytkownika
Funkcje - Zadanie domowe
» 2014-07-18 18:22:34
"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."

Oto mój kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;


int los()
{
    int a;
    a =(( std::rand() % 50 ) );
    return a;
}

int main()
{
    srand( time( NULL ) );
    int a, b;
    b = 0;
    do
    {
        a = los();
        cout << "Wylosowana liczba to " << a << endl;
        cout << "Zakonczyc? [0]Tak [1]Nie: ";
        cin >> b;
        cin.clear();
        cin.sync();
    } while( b != 0 );
   
}

Następujące pytania/problemy:
1. Nie rozumiem do końca działania std::rand, często używam jej na czuja, czy ktoś mi może wyjaśnić dokładnie jak jej używać? Jak działa? Byłbym wdzięczny, gdyż to główny problem tematu.

2. Tutaj już bardziej opcjonalnie, jeżeli ktoś uważa że zadanie wykonałem źle proszę o naganę, oczywiście proszę również o uzasadnienie czemu zostało wykonane źle :)


Edit:
Właściwie byłoby miło gdyby ktoś powiedział jak mogę oprawić ładnie w ramkę i kolory mój kod źródłowy wrzucany na forum, dość przydatny zabieg którego zapomniałem jak robić.
P-113975
Monika90
» 2014-07-18 18:31:22
1. Nie rozumiem do końca działania std::rand, często używam jej na czuja, czy ktoś mi może wyjaśnić dokładnie jak jej używać? Jak działa? Byłbym wdzięczny, gdyż to główny problem tematu.
Najlepiej nie używać rand w ogóle, C++ ma dużo lepsze sposoby generowania liczb pseudolosowych, (nagłówek <random>)

Edit:
Właściwie byłoby miło gdyby ktoś powiedział jak mogę oprawić ładnie w ramkę i kolory mój kod źródłowy wrzucany na forum, dość przydatny zabieg którego zapomniałem jak robić.
Patrz dział Kursy / Kurs STC
P-113976
pekfos
» 2014-07-18 19:05:20
2. Tutaj już bardziej opcjonalnie, jeżeli ktoś uważa że zadanie wykonałem źle proszę o naganę, oczywiście proszę również o uzasadnienie czemu zostało wykonane źle :)
Jest wykonane źle, bo losujesz z przedziału [0, 49], zamiast [50, 60].
C/C++
rand() % ile_liczb + od_ktorej
A najlepiej użyć nowych metod losowania liczb, tam nie trzeba kombinować z modulo.
P-113978
Daedra
Temat założony przez niniejszego użytkownika
» 2014-07-18 19:14:37
Dzięki za pomoc, lecz poprosiłbym was jeszcze o jedną rzecz, co prawda Monika napomniała o <random> ale wiele mi to nie mówi niestety, czy możecie podać mi jeszcze sposoby/komendy ewentualnie biblioteki służące do takiego generowania liczb? Na przykładach najlepiej :)
P-113979
Monika90
» 2014-07-18 20:01:25
powiedzmy, że chcemy losować liczby typu double z przedziału od -1/3 do +1/3 i liczby typu int z przedziału od zera do miliona włącznie, no to robimy tak

#include <iostream>
#include <ctime>
#include <random>

int main()
{
    std::mt19937 rng(std::time(NULL));
    std::uniform_real_distribution<double> d1(-1/3., +1/3.);
    std::uniform_int_distribution<int> d2(0, 1000000);

    for (int i = 0; i < 13; ++i)
    {
        std::cout << d1(rng) << ", ";
        std::cout << d2(rng) << "\n";
    }
}


najpierw tworzymy generator liczb losowych
std::mt19937 rng(std::time(NULL));

który trzeba jakoś zainicjalizować, tutaj tradycyjnie jest inicjalizowany za pomocą time(NULL), co oczywiśie nie jest dobrym rozwiązaniem i można lepiej:
std::mt19937 rng(std::random_device{}());

ale pokazuję ten zły sposób z time, bo random_device w niektórych wersjach biblioteki standardowej moze nie być zaimplementowane tak jak powinno i jest bezużyteczne (choć łatwo zrobić swoje własne).

następnie tworzymy dystrybucje
    std::uniform_real_distribution<double> d1(-1/3., +1/3.);
    std::uniform_int_distribution<int> d2(0, 1000000);

zadaniem dystrybucji jest przekształcanie losowych bitów tworzonych przez generator w liczby.
Dla całkowitych używasz uniform_int_distribution, dla ułamkowych uniform_real_distribution. Oprócz tych dwóch w bilbiotece jest mnóstwo innych dystrybucji, np. dla rozkładu normalnego, itp.

No i jak już to mamy to możey sobie używać:
wywołanie d1(rng) losuje liczbę przy użyciu dystrybucji d1 i generatora rng.

EDIT:
Ten generator liczb losowych (mt19937) najlepiej utworzyć jeden dla całego program (albo jeden dla każdego wątku) i przkazywać go przez referencję do tych funkcji w których jest potrzebny. Ewentualnie mógłby być globalny, ale zmienne globalne to straszne zło.
P-113981
Daedra
Temat założony przez niniejszego użytkownika
» 2014-07-18 21:54:51
Dzięki za pomoc, problem rozwiązany ;)
P-113986
« 1 »
  Strona 1 z 1