Forum: C++ rand()

Forum huvudsida -> Programmering -> C++ rand()

Sidor: 1

Till botten

eilenna71 23:09 - 22:a Januari 2007 | Post #1
Medlem
Inlägg: 4


Skicka PM
Hej!
Hur gör jag för att slumpa fram tal i intervallet EUR"5000 .. 5000?

Jag läste det som står på nybörjarkursen och testade det i mitt program (se rad 30), kruxet är att jag bara får ut negativa tal! Vad har jag gjort för fel? Skulle jag ha använt modulus istället? ,,r det någon som kan förklara skillnaden mellan div och mod vid rand-funktionen, när använder man det ena och när använder man det andra?

  1.  
  2. #include <iostream> // cin, cout
  3. #include <iodos.h> // för att få utskrifter med å..., ä,, och ö-
  4. #include <time.h> // srand(time(0)
  5. #include <iomanip> // setw
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10. // Konstanter
  11. const int MIN_TAL = -5000;
  12. const int MAX_TAL = 5000;
  13.  
  14. // Variabler
  15. int ant_elem;
  16.  
  17. // Här börjar programmet
  18. dos_console();
  19.  
  20. cout << "Ange antal element i arrayen: ";
  21. cin >> ant_elem;
  22.  
  23. int *dyn_arr = new int[ant_elem];
  24.  
  25. // Slumpa tal till arrayens element. Talen ska ligga i intervallet EUR"5000 .. 5000.
  26. srand(time(0));
  27.  
  28. for (int i = 0; i < ant_elem; i++)
  29. {
  30. dyn_arr[i] = rand() / (RAND_MAX / MAX_TAL + 1 ) + MIN_TAL;
  31. cout << i << " = " << dyn_arr[i] << endl;
  32. }
  33. delete []dyn_arr;
  34. return 0;
  35. }


Hoppas det finns någon som kan hjälp mig, jag har testat lite olika kombinationer men får antingen till bara positiva tal eller negativa, aldrig både och...

// ANI

-------------------------
Ingen signatur!



FunkyChicken 00:43 - 23:e Januari 2007 | Post #2
Nyhetsredaktör
Inlägg: 800


Skicka PM
Antar att du kapat indys rad rakt av, inget fel med det men det funkar tyvärr inte alltid. Fundera på hur den fungerar istället!

rand() / (RAND_MAX / MAX_TAL + 1 )

ger dig ett tal mellan noll och 4999, sedan gör du

+ MIN_TAL

dvs du drar bort 5000. Alltså blir resultatet negativt.

Kanske bäst att nån som faktiskt sysslar med C++ slänger ett öga hitåt och ser till att jag inte pratar i nattmössan, men följande lilla modifiering borde ge dig önskat resultat:

dyn_arr[i] = rand() / (RAND_MAX / (MAX_TAL - MIN_TAL) + 1 ) + MIN_TAL;

(Tänk: Du har ett visst _intervall_ av tal, i detta fall 10'000 tal långt, och du vill att det ska börja på -5'000 )

Skillnaden mellan div och mod ("kongruensoperatorn") fungerar inte på något särskilt vis just vid användning med rand() utan precis som vanligt: division ger dig kvoten mellan två tal - speciellt får du ett avrundat svar om täljaren och nämnaren är heltal från början - och modulus ger dig RESTEN vid divisionen, dvs 10 % 4 = 2.

Algebra är din vän.




eilenna71 01:09 - 23:e Januari 2007 | Post #3
Medlem
Inlägg: 4


Skicka PM
Yes!
Det ser ut att funka, tack så mycket!!!
Jag är lite mosig i hjärnan och hade missat hur det funkade, men med din förklaring klaffade det nästan på en gång.

Jag var på vippen att missa det lilla minustecknet i min konstant MIN_TAL, så först tyckte jag att det såg konstigt ut att ta 5000 -5000 = 0... Men så kom jag på att det faktiskt var 5000 -(-5000) =10000 (som du skrev) ;o)

Nu kan jag äntligen gå och sova! Det behövs verkligen...

MVH // ANI

-------------------------
Ingen signatur!



Sidor: 1

Forum huvudsida -> Programmering -> C++ rand()
Atom feed

Du får inte posta i den här tråden | Till toppen