Slonzok Temat założony przez niniejszego użytkownika |
[Lekcja 17]Funkcja losująca - pytanie » 2011-11-08 22:30:53 Witam, jako że jestem zapominalski, czasem o czymś zapomę i dopiszę to albo jak kompilator wywali mi błąd albo jak sobie przypomnę. Zadaniem było napisać funkcję losującą: int wylosuj( int start, int stop ) { int liczba =( rand() % stop ) + start; return liczba; } Dlaczego program zadziałał prawidłowo, mimo iż za 1 razem nie było return liczba; ? Reszta kodu to kod z lekcji. |
|
DejaVu |
» 2011-11-08 22:52:54 Nie zadziałał prawidłowo, ponieważ zwrócił przypadkową wartość, a nie wylosowaną wartość. Przypadkowa wartość z dużym prawdopodobieństwem będzie spoza zakresu, który sobie 'założyłeś'. |
|
akwes |
» 2011-11-08 23:05:09 @DejaVu Jak to nie będzie z zakresu? Jak reszta z dzielenia przez zmienną może być większa od zmiennej :P ? //edit Znaczy... To jeszcze zależy jak rozumiemy w zakres start i stop. Jeżeli w wersji <start, stop> to jednak nie. Myślałem że chodzi o wersję start i ile od startu dalej czyli <start, start+stop>. No ale może źle zrozumiałem wtedy ;p Dlaczego nie jest dobrze dla <start,stop>? Bo dla wylosuj(11,19) by było rand()%19 + 11, a to w złym przypadku wynosi 18+11 = 29. [SPOJLER Z ROZWIĄZANIEM] Dla przedziału <start, stop> potrzeba by czegoś takiego #include <iostream> #include <conio.h> #include <time.h>
int wylosuj( int start, int stop ) { stop = stop - start + 1; int liczba =( rand() % stop ) + start; return liczba; }
int main() { for( int i = 0; i < 100; i++ ) { std::cout << wylosuj( 11, 19 ) << ' '; } getch(); return 0; }
|
|
DejaVu |
» 2011-11-09 08:37:35 Jeżeli nie napisze returna to nie zwróci wartości, którą sobie wyliczył w zmiennej tylko wartość całkowicie przypadkową. |
|
ison |
» 2011-11-09 13:54:15 Jeżeli nie napisze returna to nie zwróci wartości, którą sobie wyliczył w zmiennej tylko wartość całkowicie przypadkową. |
jest to zwyczajnie operacja niezdefiniowana, w niektórych wersjach g++ było tak, że zwracaną wartością była ostatnia użyta zmienna w funkcji, był więc trick na napisanie funkcji liczącej nwd mającej zaledwie 8 znaków :) (kiedyś podawałem link do strony z zagadkami C++, kto rozwiązywał to wie ;)) |
|
akwes |
» 2011-11-09 16:46:13 @DejaVu
Jak przeglądałem był już return ; < Wybacz :P |
|
Slonzok Temat założony przez niniejszego użytkownika |
» 2011-11-10 00:38:07 @DejaVu Faktycznie, gdy brak return; wartości przekraczają zakres. @akwes Wybacz ale nie do końca rozumiem ten zapis: [quote]Bo dla wylosuj(11,19) by było rand()%19 + 11, a to w złym przypadku wynosi 18+11 = 29.[/quote] Czyli co, 29 to liczba kończąca zakres?? Dlaczego?? Myślałem że wylosowane liczby będą mieściły się w przedziale 11..18 Według tego co pisze na lekcji: [quote] int wylosowana_liczba =( rand() % ile_liczb_w_przedziale ) + startowa_liczba; Ostatecznie program losujący liczby z przedziału od 7 do 56 będzie więc wyglądał tak: int wylosowana_liczba =( rand() % 50 ) + 7; [/quote] |
|
ptaq |
» 2011-11-10 00:44:57 losowanie liczb z zakreu od 11 do 18 bedzie wygladało tak ( rand() % 8 ) + 11 |
|
« 1 » 2 |