4-stable and C rand()?

Jason Andresen jandrese at mitre.org
Mon Apr 7 22:32:40 PDT 2003


Eric Timme (by way of Eric Timme ) wrote:
> Hi everyone, sorry if this has been answered before - I caught a whiff of a
> discussion about c's rand() function in a mailing list archive, but couldn't
> find a definitive answer.
> 
> I'm trying to do a simple CS project on my machine where I generate two sets
> of values in parallel using rand() and am running into infinite loops of
> values, and couldn't figure out why, so I wrote a test program:
> 
> #include <iostream>
> #include <cstdlib>
> #include <ctime>
> 
> int main()
> {
>         int a, b;
>         srand((unsigned)time(0));
> 
>         for (int i=0 ; i < 50 ; i++)
>                 cout << rand() % 32 << "   " << rand() % 4 << endl;
> 
>         return 0;
> }
> 
> No matter how many times I run this it seems to alternate between generating
> two different but non-unique sets of values, depending on whether time(0) is
> even or odd..and I can't understand why (values at the end of this message).
> 
> My uname -a is:
> FreeBSD repose 4.8-RC FreeBSD 4.8-RC #0: Mon Mar 24 09:13:35 CST 2003
> timothy at repose:/usr/obj/usr/src/sys/Repose  i386
> 
> It seems like the consensus on the thread I read was to use /dev/random or
> /dev/urandom..but this isn't really an option for a CS project a TA has to
> grade, so I've had to SSH out to finish the project.  I just want to know
> what I'm doing wrong, and why I can't do this on my FreeBSD machine =\

If using random() is truely out of the question, you might try using 
some of the other bits in the returned number.  The results wont' be 
very random, but at least they won't be annoyingly cyclic.

Something like:
cout << ( rand() >> 5 ) % 32 << "   " << ( rand() >> 5 ) % 4 <<
endl;

You should be aware that FreeBSD isn't the only platform with a lousy 
rand() function.  There is a good chance the rand() on your TA's machine 
is going to return results like this as well.  You may want to use 
configure if possible to test for the existence of a better random 
number generator, and use that instead if possible.

-- 
   \  |_ _|__ __|_ \ __| Jason Andresen        jandrese at mitre.org
  |\/ |  |    |    / _|  Network and Distributed Systems Engineer
_|  _|___|  _| _|_\___| Office: 703-883-7755




More information about the freebsd-stable mailing list