Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 25 Feb 2001 19:34:09 +0300
From:      "Andrey A. Chernov" <ache@nagual.pp.ru>
To:        "Jacques A. Vidrine" <n@nectar.com>, Matt Dillon <dillon@earth.backplane.com>, Bruce Evans <bde@zeta.org.au>, Kris Kennaway <kris@obsecurity.org>, Robert Watson <rwatson@FreeBSD.org>, Nick Sayer <nsayer@FreeBSD.org>, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   rand.c patch for review (was: Re: cvs commit: ports/astro/xglobe/files patch-random)
Message-ID:  <20010225193409.A56351@nagual.pp.ru>
In-Reply-To: <20010225191316.A56093@nagual.pp.ru>; from ache@nagual.pp.ru on Sun, Feb 25, 2001 at 07:13:17PM %2B0300
References:  <Pine.BSF.4.21.0102251920150.6561-100000@besplex.bde.org> <200102250900.f1P90Qc12868@earth.backplane.com> <20010225092416.A46959@hamlet.nectar.com> <20010225185535.A55782@nagual.pp.ru> <20010225191316.A56093@nagual.pp.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Feb 25, 2001 at 19:13:17 +0300, Andrey A. Chernov wrote:
> On Sun, Feb 25, 2001 at 18:55:36 +0300, Andrey A. Chernov wrote:
> > On Sun, Feb 25, 2001 at 09:24:16 -0600, Jacques A. Vidrine wrote:
> > > My conclusion is that either:
> > >  
> > >    Our implementation of `rand' loses.  
> > 
> > We can easily improve much our rand() random distribution staying inside
> > the same API by using just different calculation formula, as we already do
> > with random(). I plan to do it long time ago, but lost interest. I can dig
> > out this formula, if someone is interested.
> 
> We already use this formula (in different context), see
> good_rand() function in stdlib/random.c

Patch for review:

--- rand.c.bak	Thu Aug 19 19:30:29 1999
+++ rand.c	Sun Feb 25 19:30:15 2001
@@ -47,7 +47,31 @@
 static int
 do_rand(unsigned long *ctx)
 {
+#ifdef  USE_WEAK_SEEDING
+/*
+ * Historic implementation compatibility.
+ * The random sequences do not vary much with the seed,
+ * even with overflowing.
+ */
 	return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
+#else   /* !USE_WEAK_SEEDING */
+/*
+ * Compute x = (7^5 * x) mod (2^31 - 1)
+ * wihout overflowing 31 bits:
+ *      (2^31 - 1) = 127773 * (7^5) + 2836
+ * From "Random number generators: good ones are hard to find",
+ * Park and Miller, Communications of the ACM, vol. 31, no. 10,
+ * October 1988, p. 1195.
+ */
+	long hi, lo, x;
+
+	hi = *ctx / 127773;
+	lo = *ctx % 127773;
+	x = 16807 * lo - 2836 * hi;
+	if (x <= 0)
+		x += 0x7fffffff;
+	return ((*ctx = x) % ((u_long)RAND_MAX + 1));
+#endif  /* !USE_WEAK_SEEDING */
 }
 
 


-- 
Andrey A. Chernov
http://ache.pp.ru/

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




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