Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 07 Apr 2003 10:22:00 -0400
From:      Jason Andresen <jandrese@mitre.org>
To:        "Eric Timme (by way of Eric Timme\\ <timothy@voidnet.com>)" <timothy@voidnet.com>
Cc:        freebsd-stable@freebsd.org
Subject:   Re: 4-stable and C rand()?
Message-ID:  <3E918988.9000402@mitre.org>
In-Reply-To: <200304070901.20557.timothy@voidnet.com>
References:  <200304070901.20557.timothy@voidnet.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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@mitre.org
  |\/ |  |    |    / _|  Network and Distributed Systems Engineer
_|  _|___|  _| _|_\___| Office: 703-883-7755




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3E918988.9000402>