losowanie liczby ponad przedzial
Ostatnio zmodyfikowano 2014-07-12 17:45
kyrtapo94 Temat założony przez niniejszego użytkownika |
losowanie liczby ponad przedzial » 2014-07-10 23:32:08 Witam, w zadaniu domowym z funkcji program losuje mi liczby z przedziału innego niz jest podany. To znaczy nie wszystkie ale kilka i nie wiem jak to naprawic. #include <iostream> #include <cstdlib> #include <ctime> using namespace std;
int wylosuj( int stop, int start ) { int liczba; liczba =( rand() % start ) + stop; return liczba; } int main() { srand( time( NULL ) ); int stop, start; cout << "Podaj poczatek przedzialu z jakiego chcesz wylosowac liczbe: \n"; cin >> stop; cout << "Podaj koniec przedzialu: \n"; cin >> start; int ile; cout << "Ile liczb chcesz wylosowac: \n"; cin >> ile; do { cout << wylosuj( stop, start ) << endl; ile--; } while( ile > 0 ); return 0; }
nie zwracajcie uwagi na to ze poczatek przedzialu to zmienna stop, po prostu kombinowalem z przestawianiem nazw zmiennych. Robiac zadanie z tablic nagle mnie oswiecilo jak zrobic to zadanie. Caly blad jest w funkcji wylosuj, poniewaz losuje ona liczbe od poczatku przedzialu (zmienna stop) do konca przedzialu, tyle ze ten przedzial nie konczy sie na zmiennej start tylko te dwie wartosci sie dodaja dlatego rzeczywisty przedzial losowania byl wiekszy. Wystarczylo odjac koniec przedzialu od poczatku i wychodzi nam nasz przedzial. liczba =( rand() % start - stop ) + stop; |
|
kubawal |
» 2014-07-11 09:40:25 liczba =( rand() % start - stop ) + stop;
|
Jak coś to rand() % (start - stop) + stop |
|
Deyvin |
» 2014-07-12 10:45:21 Chiałem tylko dodać, że powinno być rand() %( start - stop + 1 ) + stop; . Dodanie jedynki powoduje że jeśli chcemy wylosować liczby z przedziału np. od 1 do 5 to 5-1=4 a do wylosowania jest 5 liczb (1,2,3,4,5) dlatego trzeba dodać tą jedynkę. |
|
WaxerPL |
» 2014-07-12 17:27:07 @up Co jeśli funkcja wylosuje 1? Następnie dodajesz do tej jedynki kolejną jedynkę i zawsze wyjdzie ci minimalnie dwójka. Teraz nigdy nie osiągniesz dwójki. Moim zdaniem powinno to wyglądać tak: rand() %(( start + 1 ) - stop ) + stop;
|
|
Deyvin |
» 2014-07-12 17:45:56 To tak nie działa. Zobacz że ten zapis rand() %( start - stop + 1 ) + stop; działa w ten sposób (chociaż dla łatwiejszego zrozumienia mógłby wyglądać tak rand() %( liczba_maksymalna - liczba_minimalna + 1 ) + liczba_minimalna; : Jeśli chcemy wylosować liczby z zakresu od 1-5 to aby określić przedział wykonujemy działanie(maksymalna liczba - minimalna +1) 5-1=4 4+1=5, nasz przedział wynosi 5 liczb, liczba startowa to jeden, czyli zmienna dodana na końcu (stop). Teraz przykłady: (po kolei jak w kodzie) rand losuje dowolną liczbę, powiedzmy że mamy 28, reszta z dzielenia 28/5 to 3, plus 1 które dodajemy na końcu to 4-mamy liczbę z przedziału. A teraz jeśli rand wylosuje dowolną liczbę podzielną przez 5 bez reszty (np 5,10,15,20,30...) to reszta z dzielenia wynosi 0, PLUS 1, które dodajemy na końcu daje nam wylosowaną liczbę 1, i minimalnie wychodzi jedynka. P.S Myślę, że w miarę prosto dałem radę to wytłumaczyć. |
|
« 1 » |