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

[Lekcja 17]Funkcja losująca - pytanie

Ostatnio zmodyfikowano 2011-11-10 16:36
Autor Wiadomość
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ą:
C/C++
int wylosuj( int start, int stop )
{
    int liczba =( rand() % stop ) + start;
    return liczba; //dopisane za 2 razem
}
Dlaczego program zadziałał prawidłowo, mimo iż za 1 razem nie było
return liczba;
?
Reszta kodu to kod z lekcji.
P-43607
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ś'.
P-43609
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 ?

C/C++
int a = 3;
/*
1%a = 1
2%a = 2
3%a = 0
4%a = 1
5%a = 2
6%a = 0
...
*/

//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
C/C++
#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;
}

P-43610
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ą.
P-43613
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 ;))
P-43616
akwes
» 2011-11-09 16:46:13
@DejaVu

Jak przeglądałem był już return ; < Wybacz :P
P-43622
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]
P-43658
ptaq
» 2011-11-10 00:44:57
losowanie liczb z zakreu od 11 do 18 bedzie wygladało tak
( rand() % 8 ) + 11
P-43659
« 1 » 2
  Strona 1 z 2 Następna strona