Hello,
please explain me the syntax of how to generate random numbers between 65 and 75 in C?

03-01-2008

xuftugulus

65 <= x <= 75

Code:

int x = (rand() &#37; 11) + 65;

You might want to initialize the random seed to get a new sequence of pseudo-random numbers on every run.
The most common technique is:

Code:

srand( time(NULL) );

03-01-2008

laserlight

I suggest reading Prelude's article on Using rand(). In particular, she points out weaknesses in xuftugulus' suggestions that you may want to be aware of.

03-01-2008

xuftugulus

Thanx for the very nice link laserlight. It really confuzzled me bedazzled head and i will use my own RNG from now on.

03-01-2008

cpjust

Quote:

Originally Posted by laserlight

I suggest reading Prelude's article on Using rand(). In particular, she points out weaknesses in xuftugulus' suggestions that you may want to be aware of.

Although I'm sure the article is correct, I still have no idea why using (rand() % n) is wrong or what that whole thing about the low order bits was talking about? I also don't know why seeding it with time() wouldn't work very well (assuming you wait > 1 second between seeds)?

03-01-2008

laserlight

Quote:

I still have no idea why using (rand() &#37; n) is wrong or what that whole thing about the low order bits was talking about?

Suppose you want the range to be [0,3). Using the rand() % n method, n = 3.

This means that half of the time you will get 0 as the random number generated. If you were looking for a uniform distribution, this obviously is not ideal.

Of course RAND_MAX is much larger than this, so the effects of the non-uniform distribution are less pronounced.

Quote:

I also don't know why seeding it with time() wouldn't work very well (assuming you wait > 1 second between seeds)?

Prelude's suggestion does seed with the return value of time(), only that it seeds with a hash of the bytes of the value returned by time().

03-01-2008

cpjust

Quote:

Originally Posted by laserlight

Prelude's suggestion does seed with the return value of time(), only that it seeds with a hash of the bytes of the value returned by time().

That's the part I don't get. How would that be any better than using time() by itself?
The article says the first random number could be the same for up to about 13 minutes by just using time(). Why?

03-01-2008

laserlight

Quote:

How would that be any better than using time() by itself?

To have guaranteed portability.

Quote:

The article says the first random number could be the same for up to about 13 minutes by just using time(). Why?

Probably implementation dependent on how srand() works.

03-01-2008

vart

Quote:

Originally Posted by cpjust

That's the part I don't get. How would that be any better than using time() by itself?
The article says the first random number could be the same for up to about 13 minutes by just using time(). Why?

I read the article to much time ago - so I do not remember the reason that Prelude was giving. But If we look at srand - it takes unsigned long
So when time() returns 8 bytes value - you will take only half of it... And this half could stay the same for very long time...

03-01-2008

dwks

Quote:

That's the part I don't get. How would that be any better than using time() by itself?

If you're only getting one random number -- it probably wouldn't make much of a difference. But if you're generating more than one number, starting a random number generator is better than just querying the time all the time. (Sorry.)

03-02-2008

whiteflags

Quote:

Originally Posted by dwks

If you're only getting one random number -- it probably wouldn't make much of a difference. But if you're generating more than one number, starting a random number generator is better than just querying the time all the time. (Sorry.)

Actually, if you're only getting one number and that number doesn't change for, say, 17 minutes, that matters quite a lot. You can go through several die rolls with that kind of time. :)

03-02-2008

cpjust

Quote:

Originally Posted by dwks

If you're only getting one random number -- it probably wouldn't make much of a difference. But if you're generating more than one number, starting a random number generator is better than just querying the time all the time. (Sorry.)

I wasn't talking about using time() as a random number. I was talking about using time() as the seed for srand().

Quote:

Originally Posted by vart

I read the article to much time ago - so I do not remember the reason that Prelude was giving. But If we look at srand - it takes unsigned long
So when time() returns 8 bytes value - you will take only half of it... And this half could stay the same for very long time...

An 8 byte value? time() returns a time_t, which is a long (which is usually 4 bytes).
But either way, even if it took half, it would only take the lower half right?

03-02-2008

whiteflags

>> An 8 byte value? time() returns a time_t, which is a long (which is usually 4 bytes).

time_t is only guaranteed to start at the epoch of computing (January 1, 1970) and be an arithmetic type. time_t as double would be an awkward, but Standards conforming implementation that isn't exactly mungeable into a unsigned int type. I haven't seen anything too different though and it is probably somewhat an irrational concern. OTOH, it is nice to have a seed which is not so bound to the clock: for one thing, hashing it makes it more difficult to predict rand()'s sequence as long as the hash algorithm is kept somewhat of a secret or is cryptographically strong anyway.

Once you figure out how a prng works and how it's seeded, predicting things is easy because you can imitate its' behavior, look for patterns, and cheat. :p

03-02-2008

dwks

Quote:

It really confuzzled me bedazzled head and i will use my own RNG from now on.

Only if you need numbers that are less pseudo-random and more random than rand() can provide.

Quote:

There is really nothing wrong with rand(), despite what you may be told. The problem is with the people who use it, and how they use it incorrectly and without having all of the facts.

Quote:

I wasn't talking about using time() as a random number. I was talking about using time() as the seed for srand().

Yes, I'm sorry, I misunderstood your post. And it was rather flawed anyway, as citizen pointed out. :)

The general idea of a hash function is that any input will generate a unique output. Ever seen MD5 sums? Change one byte, and the entire thing changes. This particular hash function just happens to be very simplistic; but using this sort of thing for a random number generator seed would probably be a very good idea.

Maybe I'd understand this better if I knew how rand() & srand() actually work.
This all seems like it should be the job that srand() should be doing, so that passing it 123456 should generate a completely different set of random numbers than passing it 123457...

BTW, what does the 2U in that code mean? I've never seen anything like that in any code.