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: #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ć. |
|
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 |
|
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]. rand() % ile_liczb + od_ktorej
A najlepiej użyć nowych metod losowania liczb, tam nie trzeba kombinować z modulo. |
|
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 :) |
|
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.
|
|
Daedra Temat założony przez niniejszego użytkownika |
» 2014-07-18 21:54:51 Dzięki za pomoc, problem rozwiązany ;) |
|
« 1 » |