On 02.07.2013 20:33, Bruce Evans wrote:
> I checked the values returned by rand().  The ACM part works as
> intended, so it never returns RAND_MAX.  It also never returns 0.  So
> the distribution of values in the documented range [0, RAND_MAX] is
> very non-uniform.  It is uniform in [1, RAND_MAX - 1].  To use this
> algorithm for rand(), 1 should have been subtracted, giving a range
> of [0, 0x7ffffffe].

Do you mean [0, 0x7ffffffd] (assuming 1 subtracted)?
See attached patch.
I don't see compatibility problems at least from POSIX specs point of
view - they don't say something specific about RAND_MAX.

-- 
http://ache.vniz.net/
bitcoin:13fGiNutKNHcVSsgtGQ7bQ5kgUKgEQHn7N
--- stdlib.h.bak        2013-07-03 00:08:25.000000000 +0400
+++ stdlib.h    2013-07-03 00:10:17.000000000 +0400
@@ -69,7 +69,7 @@
 #define        EXIT_FAILURE    1
 #define        EXIT_SUCCESS    0
 
-#define        RAND_MAX        0x7fffffff
+#define        RAND_MAX        0x7ffffffd
 
 __BEGIN_DECLS
 #ifdef _XLOCALE_H_
--- rand.c.bak  2013-07-03 00:08:00.000000000 +0400
+++ rand.c      2013-07-03 00:11:33.000000000 +0400
@@ -75,7 +75,8 @@
        x = 16807 * lo - 2836 * hi;
        if (x < 0)
                x += 0x7fffffff;
-       return ((*ctx = x) % ((u_long)RAND_MAX + 1));
+       *ctx = x;
+       return (x - 1);
 #endif  /* !USE_WEAK_SEEDING */
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to