Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 Feb 1999 11:31:19 -0800
From:      Josef Grosch <jgrosch@mooseriver.com>
To:        cjclark@home.com
Cc:        patseal@hyperhost.net, freebsd-questions@FreeBSD.ORG
Subject:   Re: Random Numbers
Message-ID:  <19990217113119.A8120@mooseriver.com>
In-Reply-To: <199902171508.KAA04420@cc942873-a.ewndsr1.nj.home.com>; from Crist J. Clark on Wed, Feb 17, 1999 at 10:08:41AM -0500
References:  <19990216220931.B5145@mooseriver.com> <199902171508.KAA04420@cc942873-a.ewndsr1.nj.home.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 17, 1999 at 10:08:41AM -0500, Crist J. Clark wrote:
> Josef Grosch wrote,
> > On Tue, Feb 16, 1999 at 09:36:40PM -0500, Patrick Seal wrote:
> > You should seed the random number generator first. Try the following;

Yes, you are correct. 

> 
> And it is my understanding you are best off only seeding it once. My
> minor changes to the code are not led by a '>.'
> 
> > int randn()
> > {
> >     int  rc = 0;
> >     long value = 0L;
>       static unsigned long seed = 0L;
> > 
>       if ( ! seed ) {
> >       pid_t   pid = getpid();
> >       time_t  now = 0;
> > 
> > 
> >       struct timeval   tp;
> >       struct timezone  tzp;
> > 
> >       gettimeofday(&tp, &tzp);
> >       now = tp.tv_sec; /* unnecessary but nice during debugging */
> >       seed = (unsigned long)(now / pid);
> >       srandom(seed);
>       }
> 
> >     value = random();
> > 
> >     rc = (value % 10);
> > 
> >     return (rc);
> > }

This is much better than  my ugly little hack.

> 
> There is a _tiny_ chance the seed might be exactly '0' after the
> first pass, in which case the seed will be recalculated next
> use. However, this reduces to the previous algorithm which redid the
> seed each time.
> 
> Also, if you want to make the code work like the original poster,
> where the range of the random number is specified, change the
> declaration of the function to take an arg,
> 
>   int randn(int range)
> 
> And then instead of the last three lines,
> 
>       return (random() % range);
> 
> The return value is 0 to (range - 1). 

The above hack was ment more of a demo of what needs to be done. There are
a number of places in the code that could be improved. 

Thanks

Josef

-- 
Josef Grosch           | Another day closer to a |    FreeBSD 3.0
jgrosch@MooseRiver.com |   Micro$oft free world  | UNIX for the masses



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




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