Hello,

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

Printable View

- 03-01-2008chottachatriHow to generate random numbers between 65 and 75
Hello,

please explain me the syntax of how to generate random numbers between 65 and 75 in C? - 03-01-2008xuftugulus
65 <= x <= 75

Code:`int x = (rand() % 11) + 65;`

The most common technique is:

Code:`srand( time(NULL) );`

- 03-01-2008laserlight
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-2008xuftugulus
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-2008cpjust
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-2008laserlightQuote:

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

Suppose also that RAND_MAX is 3. Then we have the following possibilities:

0 % 3 = 0

1 % 3 = 1

2 % 3 = 2

3 % 3 = 0

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)?

- 03-01-2008cpjust
- 03-01-2008laserlightQuote:

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

Quote:

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

- 03-01-2008vart
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-2008dwksQuote:

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

- 03-02-2008whiteflags
- 03-02-2008cpjust
I wasn't talking about using time() as a random number. I was talking about using time() as the seed for srand().

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-2008whiteflags
>> 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-2008dwksQuote:

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

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().

So . . . why is this

Code:`unsigned time_seed()`

{

time_t now = time ( 0 );

unsigned char *p = (unsigned char *)&now;

unsigned seed = 0;

size_t i;

for ( i = 0; i < sizeof now; i++ )

seed = seed * ( UCHAR_MAX + 2U ) + p[i];

return seed;

}

srand ( time_seed() );

Code:`srand((unsigned)time(0));`

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.

http://en.wikipedia.org/wiki/Cryptog..._hash_function

http://en.wikipedia.org/wiki/Hash_function - 03-02-2008cpjust
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.