Forum » Programiranje » [C++] Generiranje naključnih števil tipa double
[C++] Generiranje naključnih števil tipa double
![](https://static.slo-tech.com/stili/avatar.gif)
c0dehunter ::
Zdravo, zanima me, kako se z generatorjem naključnih števil generira double število? Nikjer ni kakšnega enostavnega odgovora, našel sem rešitve, da namesto % uporabiš eno drugo funkcijo (katere ime sem pozabil), pa recimo da napišeš svojo funkcijo za generiranje double števil s pomočjo nekega zapletenega algoritma... V Javi lahko čist preprosto poveš, al hočeš definirat celo al realno število.
Recimo, da hočem generirat celo število v obsegu od 0 do 99, bi napisal naslednje:
Kako bi sedaj na tem istem primeru generiral realno število?
Recimo, da hočem generirat celo število v obsegu od 0 do 99, bi napisal naslednje:
srand(time(NULL)); int a= rand() % 100;
Kako bi sedaj na tem istem primeru generiral realno število?
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
mn ::
srand(time(NULL)); double a= static_cast<double>(rand)/static_cast<double>(RAND_MAX);
bi ti moralo vrniti float med 0 in 1.
![](https://static.slo-tech.com/stili/avatar.gif)
c0dehunter ::
Aha, torej generiram en int, pa prištejem še generiran double med 0 in 1. Seveda vse tipa double.
Kako to da niso vključli kako funkcijo za float random v c++? Zdaj če bi rabil to večkrat generairat, si morš svojo funkcijo napisat pri vsakmu programu.
Kako to da niso vključli kako funkcijo za float random v c++? Zdaj če bi rabil to večkrat generairat, si morš svojo funkcijo napisat pri vsakmu programu.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
mn ::
Aha, torej generiram en int, pa prištejem še generiran double med 0 in 1. Seveda vse tipa double.
Pravzaprav ne. Kakor sklepam po dokumentaciji ti vrne funkcija rand() celo stevilo, ki je random stevilka med 0 in RAND_MAX. Koliko je RAND_MAX je odvisno od tistega, ki je napisal knjiznjico in je lahko na razlicnih racunalnikih drugacna.
Ampak recimo, da je RAND_MAX == 32,768. V tem primeru ti vrne rand() funkcija random stevilko med 0 in 32,768.
Primer: ce rand() vrne 1234, to pomeni, da je tvoja double random stevilka 1234/32,768. Vendar ker sta obe stevili tipa int se naredi celostevilcno deljenje in bi bil rezultat vedno 0. Zato sem dodal se static_cast<double> kar pomeni, da delis dve stevili tipa double in bos dobil tudi rezultat tipa double.
Ne vem pa zakaj bi karkoli pristeval? Ce potrebujes recimo nakljucna realna stevila med 0 in 100 bi napisal tole:
srand(time(NULL)); double a= (static_cast<double>(rand)/static_cast<double>(RAND_MAX))*100.;
Ne morem pa vedeti, ce bo to OK za tvoje potrebe. Racunaj, da imas samo 32 tisoc moznih razlicnih rezultatov!
![](https://static.slo-tech.com/stili/avatar_gray.gif)
mn ::
Sem se enkrat prebral kar si napisal. Ce si mislil tole:
Potem bo seveda tudi delalo.V tem primeru bi moral dobiti random stevilko med 0 in RAND_MAX+1 (verjetno 32,769).
srand(time(NULL)); double a= static_cast<double>(rand)+(static_cast<double>(rand)/static_cast<double>(RAND_MAX));
Potem bo seveda tudi delalo.V tem primeru bi moral dobiti random stevilko med 0 in RAND_MAX+1 (verjetno 32,769).
![](https://static.slo-tech.com/stili/avatar.gif)
c0dehunter ::
Aha, hvala ti!
To je to, kar iščem. Le da generiram med 1 in 5000.
Drugače sem pa prej mislil, da bi:
1. generiral celo število a med 1 in 5000
2. a pretvoril v double
3. generiral double število b
4. seštel a+b in dobil random double število
double a= (static_cast<double>(rand)/static_cast<double>(RAND_MAX))*5001;
To je to, kar iščem. Le da generiram med 1 in 5000.
Drugače sem pa prej mislil, da bi:
1. generiral celo število a med 1 in 5000
2. a pretvoril v double
3. generiral double število b
4. seštel a+b in dobil random double število
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
![](https://static.slo-tech.com/stili/avatar.gif)
c0dehunter ::
Še nekaj me zanima: če jaz podam v neko funkcijo polje in potem v tisti funkciji z poljem nekaj delam, se polje v glavnem programu spremeni. Ok, might come in handy, sam ka pa če tega NOČEM?
Primer:
v glavnem programu pa kličem funkcijo takole:
A se ne ustvari v funkciji novo polje identično prvemu, le da nekje drugje v pomnilniku?
Primer:
void navadno(double polje2[], int n){ double vmesna; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if(polje2[j]>polje2[i]){ vmesna=polje2[i]; polje2[i]=polje2[j]; polje2[j]=vmesna; } } } }
v glavnem programu pa kličem funkcijo takole:
navadno(polje, 10);
A se ne ustvari v funkciji novo polje identično prvemu, le da nekje drugje v pomnilniku?
I do not agree with what you have to say,
but I'll defend to the death your right to say it.
but I'll defend to the death your right to say it.
![](https://static.slo-tech.com/stili/avatar_gray.gif)
mn ::
A se ne ustvari v funkciji novo polje identično prvemu, le da nekje drugje v pomnilniku?
Ne, ker "double polje2[]" je resnici pointer na tvoje originalno polje.
Tukaj imas vec opcij: C-jevska bi bila nekaj taksnega:
void navadno(double polje[], int n){ /*nov array*/ double* polje2 = new double[n]; /*kopiram array*/ memcpy(polje2, polje, n*sizeof(double)); double vmesna; for(int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if(polje2[j]>polje2[i]){ vmesna=polje2[i]; polje2[i]=polje2[j]; polje2[j]=vmesna; } } } delete [] polje2; }
Vendar ti bolj priporocam C++ varianto:
void navadno(std::vector<double> polje2){ double vmesna; for(int i=0; i<polje2.size(); i++){ for(int j=i+1; j<polje2.size(); j++){ if(polje2[j]>polje2[i]){ vmesna=polje2[i]; polje2[i]=polje2[j]; polje2[j]=vmesna; } } } }
Aja, pa se ena stvar. Nimam C++ prevajalnika pri roki tako da vse tole pisem bolj ali manj iz glave tako da vse napisano preveri!
Zgodovina sprememb…
- spremenilo: mn ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Vprašanje v zvezi z rand() funkcijoOddelek: Programiranje | 5520 (4710) | fireice |
» | C++Oddelek: Programiranje | 1276 (1012) | BALAST |
» | [C] Random funkcijaOddelek: Programiranje | 2341 (2172) | primozsu |
» | [C] random do poljubne številkeOddelek: Programiranje | 2174 (1841) | napsy |
» | srand in program v Cju???Oddelek: Programiranje | 1607 (1477) | nuclear |