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

losowanie liczby ponad przedzial

Ostatnio zmodyfikowano 2014-07-12 17:45
Autor Wiadomość
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.
 
C/C++
#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;
P-113606
kubawal
» 2014-07-11 09:40:25
C/C++
liczba =( rand() % start - stop ) + stop;

Jak coś to rand() % (start - stop) + stop
P-113613
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ę.
P-113671
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:

C/C++
rand() %(( start + 1 ) - stop ) + stop;
P-113687
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ć.
P-113691
« 1 »
  Strona 1 z 1