| | |
c++ random numbers
![]() |
Hi all,
I am making a text game in c++ and i am trying to get the player's attack to ba a random number between 1 and 7, but when i try to compile it, it gives me this error:
49 C:\Documents and Settings\Games\Desktop\C++ Tutorial\Combat\main.cpp void value not ignored as it ought to be
heres the code:
Any ideas?
I am making a text game in c++ and i am trying to get the player's attack to ba a random number between 1 and 7, but when i try to compile it, it gives me this error:
49 C:\Documents and Settings\Games\Desktop\C++ Tutorial\Combat\main.cpp void value not ignored as it ought to be
heres the code:
c++ Syntax (Toggle Plain Text)
#include <iostream> #include <string> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; class Badguy { private: int health, defense, damage; char name; public: Badguy(); friend class Player; friend void damageCalc(Badguy Brutus, Player Popeye); }; class Player { private: string name; int attack, attack1, attack2, attack3; public: Player (); friend void damageCalc(Badguy Brutus, Player Popeye); }; void damageCalc(Badguy Brutus, Player Popeye){ Brutus.damage = Popeye.attack - Brutus.defense; if (Brutus.damage > Brutus.defense) { cout << "You damaged the orc!" << endl; Brutus.health -= Brutus.damage; cout << "The orc's health is: " << Brutus.health << endl; } else if (Brutus.damage < Brutus.defense) { cout << "You did'nt do any damage..." << endl; } } Badguy::Badguy(){ health = 100; defense = 3; }; Player::Player(){ name = "Tom"; attack1 = 1; // attack2 = 7; // attack3 = random_shuffle(attack1, attack2); //Here is the part i am talking about attack = attack3; // }; int main() { int loop = 1; string choice; Player p; Badguy b; cout << "Do you want to attack the orc:"; getline (cin, choice); while (loop == 1){ if (choice == "yes"){ damageCalc(b,p); cout << "Do you want to attack again:"; getline(cin, choice); } else if (choice == "no"){ loop = 0; } } }
Any ideas?
...
Replace the function call in the line
attack3 = random_shuffle(attack1, attack2);
by
attack3 = rand() / (int) (((unsigned)RAND_MAX + 1) / 8);
include stdlib.h at the top.
rand() returns an integer between 0 and RAND_MAX which is defined in stdlib.h
int in the denominator for avoiding floating point result.
8 for the reason, you want the number between 1 to 7.
Please find some more references to rand().
attack3 = random_shuffle(attack1, attack2);
by
attack3 = rand() / (int) (((unsigned)RAND_MAX + 1) / 8);
include stdlib.h at the top.
rand() returns an integer between 0 and RAND_MAX which is defined in stdlib.h
int in the denominator for avoiding floating point result.
8 for the reason, you want the number between 1 to 7.
Please find some more references to rand().
Last edited by mrinal.s2008; Dec 18th, 2008 at 6:43 am.
•
•
Join Date: Sep 2008
Posts: 90
Reputation:
Solved Threads: 12
A much clearer method would be
If you want the numbers to be as random as possible, add the line
For more information about srand() and rand() you can read:
http://www.cplusplus.com/reference/c...dlib/rand.html
rand()%x , where x is the number you want. For example, rand()%7 will return a random number between 0 and 6, and the code rand()%7+1 will return a value between 1 and 7.If you want the numbers to be as random as possible, add the line
srand(time(NULL)); before calling rand() (it's only necessary to use it once).For more information about srand() and rand() you can read:
http://www.cplusplus.com/reference/c...dlib/rand.html
Last edited by unbeatable0; Dec 18th, 2008 at 7:51 am.
>A much clearer method would be rand()%x , where x is the number you want.
Clearer, but not necessarily better. rand has subtleties that need to be considered. In particular, there are two distinct problems with rand: one historical and one that is still common.
The historical problem is that older implementations of rand (and extremely poor modern implementations) show a pattern where the low order bits of the random number are decidedly nonrandom. Because the remainder trick (
The solution for the historical problem is to use the high order bits instead with some variation of division by RAND_MAX (
The second problem is one of distribution. Both of the above methods (remainder and division by RAND_MAX) have the same problem with distribution, regardless of the quality of rand. Because implementations of rand have pretty much been fixed, the historical problem isn't much of a problem anymore, but the problem of distribution is still present. Except in very specific exceptions, some numbers will be produced with a higher frequency than others because rand is designed to return values in a certain range, and if you close that range then the pigeonhole principle is in effect and the hole with more pigeons will show up more often.
What the two methods above do is merge ranges into a single value. For example if the full range of rand is [0, 10) and you want a value in the range of [0,1], you need to pretend that any value in the range of [0, 5) represents 0 and any value in the range of [5, 10) represents 1:
That's all well and good because 10 is evenly divisible by 2, but what if you want numbers in a range of [0, 2]? 10 isn't evenly divisible by 2, so you have to make one group larger than the other two:
Now 2 will be more common than 0 and 1 because the range that's assumed to be 2 is larger than the range that's assumed to be 0 or 1. This is the distribution problem. To fix the distribution, I prefer to use a uniform deviate:
The difference is that instead of trying to shrink the range of the random number (which breaks the distribution except when the RAND_MAX is evenly divisible by N, a uniform deviate produces a random value in the range of [0, 1) in floating-point, which can then be multiplied to get a suitable range without affecting the distribution. It's tedious to type, so a function would be better suited:
I'd also rant about using time to seed the random number generator, but people have a tendency to ignore my advice on that matter.
Clearer, but not necessarily better. rand has subtleties that need to be considered. In particular, there are two distinct problems with rand: one historical and one that is still common.
The historical problem is that older implementations of rand (and extremely poor modern implementations) show a pattern where the low order bits of the random number are decidedly nonrandom. Because the remainder trick (
rand() % N ) uses the low order bits, it fails miserably for smaller values of N.The solution for the historical problem is to use the high order bits instead with some variation of division by RAND_MAX (
rand() / ( RAND_MAX / N + 1 ) ). If you have a small value of N and a weak implementation of rand, this method is vastly more effective.The second problem is one of distribution. Both of the above methods (remainder and division by RAND_MAX) have the same problem with distribution, regardless of the quality of rand. Because implementations of rand have pretty much been fixed, the historical problem isn't much of a problem anymore, but the problem of distribution is still present. Except in very specific exceptions, some numbers will be produced with a higher frequency than others because rand is designed to return values in a certain range, and if you close that range then the pigeonhole principle is in effect and the hole with more pigeons will show up more often.
What the two methods above do is merge ranges into a single value. For example if the full range of rand is [0, 10) and you want a value in the range of [0,1], you need to pretend that any value in the range of [0, 5) represents 0 and any value in the range of [5, 10) represents 1:
C++ Syntax (Toggle Plain Text)
0 1 --------- --------- 0 1 2 3 4 5 6 7 8 9
C++ Syntax (Toggle Plain Text)
0 1 2 ----- ----- ------- 0 1 2 3 4 5 6 7 8 9
C++ Syntax (Toggle Plain Text)
#include <cstdlib> #include <iostream> int main() { for ( int i = 0; i < 20; i++ ) std::cout<< ( std::rand() * ( 1.0 / ( RAND_MAX + 1.0 ) ) ) * 7 + 1 <<'\n'; }
C++ Syntax (Toggle Plain Text)
#include <cstdlib> #include <iostream> double udrand ( int lo, int hi ) { static const double base = 1.0 / ( RAND_MAX + 1.0 ); double deviate = std::rand() * base; return lo + deviate * ( hi - lo ); } int main() { for ( int i = 0; i < 20; i++ ) std::cout<< udrand ( 1, 7 ) <<'\n'; }
In case you were wondering, yes, I do hate you.
![]() |
Similar Threads
- Compile time errors in C++ while generating random numbers (C++)
- C++ Random Numbers (C++)
- C++ Reorder random numbers (C++)
- random numbers all different??? (C++)
Other Threads in the C++ Forum
- Previous Thread: What kind of Jobs can you get knowing C++
- Next Thread: convert matlab to c++ code
Views: 1646 | Replies: 3
| Thread Tools | Search this Thread |
Tag cloud for C++
6 api array arrays assignment beginner binary borland c++ c/c++ calculator char class classes code compile compiler console constructor conversion convert count data delete desktop dll encryption error file forms fstream function functions game givemetehcodez graph homework http iamthwee ifstream input int java lazy lib link linker list loop looping loops map math matrix memory newbie news number objects output pointer pointers problem program programming project python qt random read recursion recursive reference return search sort sorting spoonfeeding string strings struct student studio system template templates text tree url variable vc++ video visual visualstudio win32 window windows winsock wordfrequency wxwidgets






