Forum » Programiranje » [C++] Generiranje naključnih števil tipa double
[C++] Generiranje naključnih števil tipa double
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.
mn ::
srand(time(NULL)); double a= static_cast<double>(rand)/static_cast<double>(RAND_MAX);
bi ti moralo vrniti float med 0 in 1.
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.
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!
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).
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.
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.
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 | 5374 (4564) | fireice |
» | C++Oddelek: Programiranje | 1253 (989) | BALAST |
» | [C] Random funkcijaOddelek: Programiranje | 2300 (2131) | primozsu |
» | [C] random do poljubne številkeOddelek: Programiranje | 2151 (1818) | napsy |
» | srand in program v Cju???Oddelek: Programiranje | 1584 (1454) | nuclear |