Forum: Slumpfunktion i C++

Forum huvudsida -> Programmering -> Slumpfunktion i C++

Sidor: 1

Till botten

Christhebalrog 16:32 - 12:a Juli 2006 | Post #1
Medlem
Inlägg: 6


Skicka PM
,,r det bara jag som har problem med slumpfunktionen i C++? har knaprat mig igenom C++-guiden på sidan, vilket har gått förhållandevis bra, då jag har grundläggande programmeringskunskaper i PHP. Men slumpfunktionen i C++ blir jag inte klok på, hur jag än gör...

Min kod:
  1. variable = rand() / (RAND_MAX / 3 + 1) + 1; // Shuffels an integer
  2.  


Grejen är att den alltid blir tre (maxvärde)... Jag vet inte varför, men koden verkar ju rätt? Skulle va schysst om någon förklarade varför funktionen är såpass avancerad (dvs. varför den ser ut som den gör)? Borde det inte finnas nåt snabbsätt att få upp ett slumpat tal på, eller måste man bygga den funktionen själv?

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



Nissebosselasse 18:43 - 12:a Juli 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM
Slumptalsfunktionen returnerar ett tal baserat på ett startvärde (ett s.k. frö) - om samma frö ges till slumptalsfunktionen varje gång, kommer samma serie "slumptal" att genereras.

Genom att använda srand sätter du ett värde på detta frö. Men då måste man ju ha ett slumpmässigt valt frö också? Japp, men det brukar man fixa genom att använda klockan:
  1.  
  2. srand (time(NULL));

Anropa srand i början av ditt program (t.ex. precis i början av main).

En enklare variant av att få slumptal, är att använda modulo (%, ger resten av en division):
  1.  
  2. // Ger ett tal mellan 0-9
  3. int i = rand() % 10;
  4.  
  5. // Ger ett tal mellan 0-394
  6. int o = rand() % 395;


-------------------------
http://pushingcows.se
Gula Nallen



Christhebalrog 03:34 - 14:e Juli 2006 | Post #3
Medlem
Inlägg: 6


Skicka PM
Tar jag helt bort srand(time(0)) så funkar det ju också, och då slumpar den olika Smiley Varför är då den raden nödvändig? För mkt kod är väl nåt man skall akta sig för?

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



Nissebosselasse 13:13 - 14:e Juli 2006 | Post #4
Medlem
Inlägg: 490


Skicka PM
Vad använder du för kompilator? Och för mycket kod behöver du inte oroa dig för; anropet till srand tar nog inte många mikrosekunder...

Jag skrev följande program:
  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4.  
  5. int main (int argc, char *argv[])
  6. {
  7. std::cout << "Testar rand..." << std::endl;
  8.  
  9. for (int i=0; i < 15; ++i) {
  10. int tal = rand() % 20;
  11. std::cout << tal << ", ";
  12. }
  13. std::cout << std::endl;
  14.  
  15. return EXIT_SUCCESS;
  16. }

..och fick följande utskrift vid tre olika körningar:

Testar rand...
1, 7, 14, 0, 9, 4, 18, 18, 2, 4, 5, 5, 1, 7, 1,

Testar rand...
1, 7, 14, 0, 9, 4, 18, 18, 2, 4, 5, 5, 1, 7, 1,

Testar rand...
1, 7, 14, 0, 9, 4, 18, 18, 2, 4, 5, 5, 1, 7, 1,

Det vill säga, samma talserie. Jag kompilerade ändå om koden mellan varje körning.

Du kan läsa mer om srand här: http://www.cplusplus.com/ref/cstdlib/srand.html och http://msdn2.microsoft.com/en-us/library/f0d4wb4t.aspx.

Sedan förstår jag inte en grej; i första posten säger du att du får samma tal varje gång (talet tre), men i sista posten får du olika varje gång... Hur ska du ha det? Smiley

Här är förresten en funktion du kan använda för att generera slumptal i ett givet intervall:
  1.  
  2. int randomize (int min, int max)
  3. {
  4. int tal = (max - min + 1) * ((double)rand() / RAND_MAX) + min;
  5. return tal;
  6. }



-------------------------
http://pushingcows.se
Gula Nallen



Christhebalrog 15:08 - 14:e Juli 2006 | Post #5
Medlem
Inlägg: 6


Skicka PM
Se här:
  1. variable = rand() / (RAND_MAX / 3 + 1) + 1;

Jag använder inte modulo för att få fram slumptalet, då jag läste guiden här, och där fanns det som jag skrev där...

Anledningen till att jag sade att jag fick olika varje gång i andra posten, var för att jag tog bort raden srand(time(0)), och då slumpade den tal som jag ville, och då undrade jag varför den var nödvändig.

Angående för mycket kod, så är väl det ganska generellt antaget att man skall ha minimalt med kod för maximal funktionalitet? ,,ven om det inte rör sig om så mycket?

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



Nissebosselasse 17:18 - 14:e Juli 2006 | Post #6
Medlem
Inlägg: 490


Skicka PM
Man behöver inte använda modulo, jag skrev det bara för att det antagligen är snabbare om man vill ha ett intervall från 0 (noll) till det man delar med.

Det där med att du får samma talserie när du använder srand låter både logiskt och ologiskt på samma gång; om man använder samma tal till srand (ex. srand (1);) så kommer samma talserie att genereras när man använder rand, men du använde ju time(0) som argument, och då borde det bli olika frö varje gång (såvida du inte kör programmet inom samma sekund, eftersom time(0) då ju returnerar samma värde - d.v.s., den aktuella sekunden).
Kan du posta koden du använder här?

Det där med minimal kod ==> maximal funktionalitet kan man tolka lite olika. Det är ändå kompilatorn som har sista ordet när den genererar maskinkoden, och du vet inte hur den kommer att optimera din C++-kod (såvida du inte skriver assemblerkoden själv inuti funktionerna).
Att göra ett läsbart program (för människor) kan vara en bättre lösning många gånger, eftersom du/andra lättare och snabbare kan sätta sig in i vad som egentligen händer.

-------------------------
http://pushingcows.se
Gula Nallen



Christhebalrog 01:08 - 15:e Juli 2006 | Post #7
Medlem
Inlägg: 6


Skicka PM
Hursomhelst så tackar jag för tipset. Du är förmodligen mer insatt i C++ än jag, då jag började för knappt en vecka sedan Smiley Här e koden:
  1. // Header files
  2. #include<iostream>
  3. #include<ctime>
  4.  
  5. // Functions to be used
  6. using std::cout; using std::cin;
  7. using std::string; using std::system;
  8. using std::srand; using std::rand;
  9.  
  10. // Creating game functions
  11. string NewGame(){ // Runs only once
  12. cout << "Enter your name and we will start playing: ";
  13. string tmpName;
  14. cin >> tmpName;
  15. system("cls");
  16. cout << "Looking for adventure, " << tmpName << "? If so, you've come to the right place!\n";
  17. return tmpName;
  18. }
  19. int mainGame(string *sName, int *iHp, int *iMinDmg, int *iMaxDmg){
  20. // Declaring variables
  21. bool bRunFight = true; // Runs while battle
  22. int iCurrentHp = *iHp; // Sets player hitpoints
  23. char cCmd;
  24. // Enemy info variables
  25. int iEType; int iEMinDmg;
  26. string iEName; int iEMaxDmg;
  27. int iEHp;
  28. while(bRunFight){
  29. system("cls");
  30. cout << "As you are walking down the path, you hear a noise. You slowly turn around...\n";
  31. iEType = rand() / (RAND_MAX / 3 + 1) + 1; // Shuffels enemy type
  32. switch(iEType){
  33. case 1:
  34. iEName = "an Eagle";
  35. iEHp = 8;
  36. iEMinDmg = 2;
  37. iEMaxDmg = 4;
  38. break;
  39. case 2:
  40. iEName = "a Spider";
  41. iEHp = 3;
  42. iEMinDmg = 2;
  43. iEMaxDmg = 10;
  44. break;
  45. case 3:
  46. iEName = "a Bull";
  47. iEHp = 15;
  48. iEMinDmg = 8;
  49. iEMaxDmg = 10;
  50. break;
  51. }
  52. while(true){
  53. cout << "You are facing " << iEName << "!\n_____________\n-------------\nEnemy stats:\n-------------\nHp: " << iEHp << "\nDamage: " << iEMinDmg << " - " << iEMaxDmg << "\n\n-------------\n";
  54. cout << "Your stats:\n-------------\nHp: " << iCurrentHp << "\nDamage: " << *iMinDmg << " - " << *iMaxDmg << "\n_____________\n\n";
  55. cout << "What is your action?\n[F]lee!\n[A]ttack!\n";
  56. cin >> cCmd;
  57. if(cCmd == 'f' || cCmd == 'F'){
  58. bRunFight = false;
  59. break;
  60. } else if(cCmd == 'a' || cCmd == 'A'){
  61. iEHp -= rand() / (RAND_MAX / *iMaxDmg + 1) + *iMinDmg;
  62. }
  63. if(iEHp <= 0){
  64. cout << "After a fancy battle, you achieve victory!\n";
  65. bRunFight = false;
  66. break;
  67. } else{
  68. iCurrentHp -= rand() / (RAND_MAX / iEMaxDmg + 1) + iEMinDmg;
  69. }
  70. if(iCurrentHp <= 0){
  71. cout << "You have struggled well, but the enemy seems to win this time...";
  72. cin.get();
  73. cin.get();
  74. bRunFight = false; // Stops main game loop
  75. break;
  76. }
  77. }
  78. }
  79. }
  80. int main (){
  81. cout << "Welcome to the HorrorWoods. To play, press Y.\n";
  82. char cCmd; // User input variable
  83. cin >> cCmd;
  84. if(cCmd == 'y' || cCmd == 'Y'){
  85. bool bRun = true; // Runs main program
  86. bool bRunFight = true; // Runs while battle
  87. } else {
  88. return 0;
  89. }
  90.  
  91. // Declaring variables
  92. int iHp = 20; // Player's health
  93. string sName = NewGame(); // User name
  94. bool bRun = true; // Runs main program
  95. int iMinDmg = 2; // Player minimum damage
  96. int iMaxDmg = 5; // Player maximum damage
  97. while(bRun){
  98. cout << "What do you want to do?\nGame menu:\n[F]ight a monster\n[H]eal yourself\n[Q]uit\n";
  99. char cCmd;
  100. cin >> cCmd;
  101. if(cCmd == 'f' || cCmd == 'F'){
  102. cout << "\nYou have chosen to fight! Prepare for battle!\n";
  103. mainGame(&sName, &iHp, &iMinDmg, &iMaxDmg);
  104. }else if(cCmd == 'h' || cCmd == 'H'){
  105. // iCurrentHp = *iHp;
  106. cout << "Healing is currently under development...\n";
  107. }else if(cCmd == 'q' || cCmd == 'Q'){
  108. bRun = false;
  109. }else{
  110. cout << "Unrecognized command.\n";
  111. }
  112. }
  113. cin.get();
  114. }


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



Sidor: 1

Forum huvudsida -> Programmering -> Slumpfunktion i C++
Atom feed

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