Gå til innhold

Tilfeldig-tall-koder i C++


Anbefalte innlegg

Hva er C++-koden for å lage et tilfeldig tall (rene tall) mindre enn x? Og hva er koden for tilfeldig tall (feks 45.6 eller 76.5, ikke rene tall) mellom x og y?

 

Jeg kjenner til "rand()", mne den kan jo bare lage tilfeldige tall fra 0 til 32767, og det er ikke bra nok for meg.

Endret av Degeim
Lenke til kommentar
Videoannonse
Annonse

[HJERTSUKK]Det er nok ikke C++-kunnskapen som har hull, men derimot mattekunnskapene.[/HJERTESUKK]

 

tilfeldigTall0tilX = (rand() * X) / RAND_MAX // RAND_MAX definert som maksverdi.

 

Evt. tilfeldigTall0tilX = rand() % (X+1) // Modulo-operasjon

 

Resulatatet kan cast'es til float hvis du trenger desimaltall.

Lenke til kommentar
Hva er C++-koden for å lage et tilfeldig tall (rene  tall) mindre enn x? Og hva er koden for tilfeldig tall (feks 45.6 eller 76.5, ikke rene tall) mellom x og y?

 

Jeg kjenner til "rand()", mne den kan jo bare lage tilfeldige tall fra 0 til 32767, og det er ikke bra nok for meg.

HVA! Er ikke rand() bra nok for deg!?! :whistle:

 

Her er iallefall hva jeg pleier å gjøre.

static const float RANDOM_MAX = 1.0f / (float)RAND_MAX;
static const float RANDOM_MAX2 = 2.0f / (float)RAND_MAX;

// Beregner et tilfeldig flyttall mellom 0.0 og 1.0.
inline float random()
{
  return (rand() * RANDOM_MAX);
}

// Beregner et tilfeldig flyttall mellom -1.0 og 1.0.
inline float random2()
{
  return ((rand() * RANDOM_MAX2) - 1.0f);
}

void test()
{
  // Finn et tall mellom 0.0 og 295.8.
  float number1 = random() * 295.8f;

  // Finn et tall mellom -250.250 og 250.250.
  float number2 = random2() * 250.250f;
}

Endret av hishadow
Lenke til kommentar

Til Feynman veil jeg gjerne si at mattekunnskapene mine er ok, og jeg har allerede tenkt ut koden dere har gitt meg, men jeg var ikke sikker på om det fantes noe enklere. Det største problemet jeg likevel hadde var at koden min alltid returnerte et heltal. Fordi jeg skrev "int" eller "float" foran variabelen der jeg definerte den. Hva jeg må skrive foran definisjonen er vel heller det jeg trenger å vite.

Lenke til kommentar

Her er den versjonen jeg har tilgjnegelig på denne pcen. Ikke bry dere med "verdi"-variabelen, og at det mangler den delen som gjør at tallet blir mellom x og y.

 

int random (int min, int maks){
float verdi = (rand()/(RAND_MAX));
return verdi;
}
          
int main (){
srand(static_cast<unsigned>(time(0 )));
int windowsIdiotSikring = random(3,5);
for(int i = 0;i<100;i++)
cout<<random(0,100)<<endl;
system("pause >nul"); 
return 0;
          }

 

Det som er problemet her er at jeg bare får en flokk med nuller der det skulle vært desimaltall (rand()/RAND_MAX).

Lenke til kommentar
Her er den versjonen jeg har tilgjnegelig på denne pcen. Ikke bry dere med "verdi"-variabelen, og at det mangler den delen som gjør at tallet blir mellom x og y.

 

Det som er problemet her er at jeg bare får en flokk med nuller der det skulle vært desimaltall (rand()/RAND_MAX).

Her har du feil:

int random (int min, int maks)

 

- funksjonen returnerer heltall, men inni funksjonen bruker du float.

- rand()/RAND_MAX blir et flyttall (mellom 0.0 of 1.0) inni random funksjonen din og når denne

returneres konverteres det til et heltall. Dette gjør at return verdien blir enten 0 eller 1.

- du må bestemme deg for om du vil bruke flyttall eller heltall i random funksjonen

din.

 

Løsning 1 (heltall):

int random(int min, int maks) {
  int differanse = maks - min;
  int verdi = rand() % differanse - min;
  return verdi;
}

 

Løsning 2 (flyttall):

float random(float min, float maks) {
  float differanse = maks - min;
  int verdi = (rand() / (float)RAND_MAX) * differanse - min;
  return verdi;
}

Endret av hishadow
Lenke til kommentar

Og kanskje også kaste resultatet fra rand til float eller double også?

 

Men bruk i stedet drand48() og dens venner.

 

SYNOPSIS
      #include <stdlib.h>

      double drand48(void);

      double erand48(unsigned short xsubi[3]);

      long int lrand48(void);

      long int nrand48(unsigned short xsubi[3]);

      long int mrand48(void);

      long int jrand48(unsigned short xsubi[3]);

      void srand48(long int seedval);

      unsigned short *seed48(unsigned short seed16v[3]);

      void lcong48(unsigned short param[7]);

Lenke til kommentar
Og kanskje også kaste resultatet fra rand til float eller double også?

 

Men bruk i stedet drand48() og dens venner.

Hvis en bruker Unix. Men hvis man er ute etter portabilitet, så kan den ikke brukes :fun:

 

alt

Endret av hishadow
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...