Advertisement

2 short questions

Started by March 09, 2000 10:49 AM
8 comments, last by Fredric 24 years, 7 months ago
I''ve got 2 questions that I''ve been wondering for a while... 1) How do I get a randomly generated number in one my apps? I need it for a simple guessing game (which is a mini-game in my other, crappy game). 2) For all of you have finished a game- how long did it take you... from the first #include to the last }, how long did it take you to completely finish your game? Programming::~Fredric(const Annoy_Ance)
3D Math- The type of mathematics that'll put hair on your chest!
Hello I''m not that experienced but there is a rand() function that returns a random number. You need to include stdlib.h but other than that I don''t know.
Jesus Freak,Jesus Loves you. He is the Alpha and Omega the Beginning and the End.
Advertisement
yep

for example

rand()%256 will generate a number in that range

Q2: I am still learning C++ so no games just yet
For random numbers:

First, #include which includes the prototypes and macros for the standard PRNG (pseudo-random number generator) functions.

Second, at the start of your program, you need to seed the PRNG using srand. You need to pass it a number like:

srand(42);

but it you seed it with a fixed number, you''ll get the same sequence every time you run the program. (Note: this is a good thing for reproducing a situation, for example, when tracking a bug.) If you want different numbers each time, then the easy way is this:

#include
#include

void main() {
srand(time(0));
}

Third, use rand() to get your numbers. It returns an integer from 0 to RAND_MAX (or is it RAND_MAX-1?). Check your documentation for specifics.

Finally, prefer (rand() / 256) over (rand() % 256). In basic PRNG''s like rand(), the low-order bits tend not to be so random. Using integer divide instead of modulo will get you better results.

There are better PRNG''s out there, but this should get you started.




---- --- -- -
Blue programmer needs food badly. Blue programmer is about to die!
Like JesusFreak said, srand() is the fastest and easisest way to do it, but you have to pass it values. Since you probably want a completly random number youll want to use the time feature in time.h.
Confused? Here''s some sample code
first you gotta seed srand():
#include
#include
void main(){
srand(time( NULL ));
}
ok now srand is seeded, now we use rand() to generate the number itself:

number = (rand() % 98) + 2;
How does this work? The modulus sign is the last interval at wich you will allow rand() to return a value, so above rand() would return a number between 0 and 98 BUT since we have a +2 at the end it will return a number between 0 and 100.
If you dont know what im talking about intervals:
0-100: 0 is the first interval, 100 is the last.
Hope this helps

P.S.
Pardon my bad grammar and spelling
"End Communication!", Kang from Rigel-4
OOPS! On my above post it doesnt tell you wich include to put: those would be stdlib.h and time.h (dont forget iostream for cin and cout )
"End Communication!", Kang from Rigel-4
Advertisement
How ((rand() % 98) + 2) can give you a 0 or a 1 ????
(rand() % 98) give you [0,97], + 2 --> [2,99]





I am interested in random number generator that doesnt need to include any files (so I could write it in assembly language). Any ideas?
http://fakemind.com
Another pitfall, as mentioned previously on this board somewhere:

Using the modulo method for getting a range of numbers is only flat if your range is a power of two. That''s kinda a hefty statement, so let me break it down:

rand is supposed to give you a flat probability, that is every number from 0 to RAND_MAX has an equal chance of being randomly picked. RAND_MAX happens to be 0x7FFF, or 32767.

The problem exists if you pick a random number between, say, 0 and 32000. If you use the modulo method, random numbers at and above 32000 will be aliased back to the range 0 through 767. That means there will be a slightly greater chance of picking 0 - 767 than there is of picking a number from 768 - 32000. Over the range of 0 to RAND_MAX, there are two values that translate to each of the numbers 0 to 767, whereas there is only one value for each of the numbers 768 - 32000.

This isn''t an issue if your range is a multiple of two. Why? Well, if you divide the whole range from 0 to RAND_MAX into two parts, each number over your range has exactly two corresponding random values--you have a flat distribution. Divide it by two again and you''re still flat. Since the range is a multiple of two to begin with, any multiple of two from 2 to 32768 as a range will be flat.

Example: using rand () % 2 for a coin flip gives you a 50/50 chance pretty exactly. Using rand () % 6 to simulate a die roll will give some numbers a greater chance of turning up than others.

Solution? If you''re not working with a power of two, conver the range to a double and calculate it:
int range = 6; // die roll
double scale = (double) range / (RAND_MAX + 1);
int result = (int) (rand () * scale); // gives you a REAL result
A book called Inner Loops has a chapter dedicated to generating random numbers in assembly - I''ll try to find it at the library again and post the code..

(of course I''ve said this before and forgot to post it so if you really want it keep bugging me about it... )

It also had a quicker way to clamp the values (faster than the divide associated with % )

This topic is closed to new replies.

Advertisement