» »

[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:

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.

mn ::

srand(time(NULL));
double a= static_cast<double>(rand)/static_cast<double>(RAND_MAX);

bi ti moralo vrniti float med 0 in 1.

mn ::

Lahko si pa tudi pogledas Boost random

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.
I do not agree with what you have to say,
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:
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!

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.

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:

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.

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Vprašanje v zvezi z rand() funkcijo

Oddelek: Programiranje
494817 (4007) fireice
»

C++

Oddelek: Programiranje
121184 (920) BALAST
»

[C] Random funkcija

Oddelek: Programiranje
92195 (2026) primozsu
»

[C] random do poljubne številke

Oddelek: Programiranje
172067 (1734) napsy
»

srand in program v Cju???

Oddelek: Programiranje
131507 (1377) nuclear

Več podobnih tem