aboutsummaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>2016-05-29 13:57:06 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>2016-05-29 13:57:06 +0000
commit44f87738345ccf7da818c80cefac28916928bebb (patch)
tree020ce8af9169c68a628aea7412b56f238f713457 /lib/libc
parent864a391104a28af650240dc9f056a8862944b52f (diff)
downloadsrc-44f87738345ccf7da818c80cefac28916928bebb.tar.gz
src-44f87738345ccf7da818c80cefac28916928bebb.zip
1) Unifdef USE_WEAK_SEEDING since it is too obsolete to support and makes
reading hard. 2) Instead of doing range transformation in each and every function here, do it single time directly in do_rand(). One "mod" operation overhead is not a big deal, but the code looks nicer and possible future functions additions or PRNG change do not miss range transformations neither have unneeded ones. 3) Use POSIX argument types for visible functions (cosmetic). MFC after: 1 week
Notes
Notes: svn path=/head/; revision=300956
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/stdlib/rand.c52
1 files changed, 11 insertions, 41 deletions
diff --git a/lib/libc/stdlib/rand.c b/lib/libc/stdlib/rand.c
index eb3c10a2894d..2e0456a9edc3 100644
--- a/lib/libc/stdlib/rand.c
+++ b/lib/libc/stdlib/rand.c
@@ -48,14 +48,6 @@ __FBSDID("$FreeBSD$");
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)
* without overflowing 31 bits:
@@ -66,48 +58,34 @@ do_rand(unsigned long *ctx)
*/
long hi, lo, x;
- /* Must be in [1, 0x7ffffffe] range at this point. */
- hi = *ctx / 127773;
- lo = *ctx % 127773;
+ /* Transform to [1, 0x7ffffffe] range. */
+ x = (*ctx % 0x7ffffffe) + 1;
+ hi = x / 127773;
+ lo = x % 127773;
x = 16807 * lo - 2836 * hi;
if (x < 0)
x += 0x7fffffff;
- *ctx = x;
/* Transform to [0, 0x7ffffffd] range. */
- return (x - 1);
-#endif /* !USE_WEAK_SEEDING */
+ x--;
+ *ctx = x;
+ return (x);
}
int
-rand_r(unsigned int *ctx)
+rand_r(unsigned *ctx)
{
u_long val;
int r;
-#ifdef USE_WEAK_SEEDING
val = *ctx;
-#else
- /* Transform to [1, 0x7ffffffe] range. */
- val = (*ctx % 0x7ffffffe) + 1;
-#endif
r = do_rand(&val);
-
-#ifdef USE_WEAK_SEEDING
- *ctx = (unsigned int)val;
-#else
- *ctx = (unsigned int)(val - 1);
-#endif
+ *ctx = (unsigned)val;
return (r);
}
-static u_long next =
-#ifdef USE_WEAK_SEEDING
- 1;
-#else
- 2;
-#endif
+static u_long next = 1;
int
rand(void)
@@ -116,13 +94,9 @@ rand(void)
}
void
-srand(u_int seed)
+srand(unsigned seed)
{
next = seed;
-#ifndef USE_WEAK_SEEDING
- /* Transform to [1, 0x7ffffffe] range. */
- next = (next % 0x7ffffffe) + 1;
-#endif
}
@@ -144,10 +118,6 @@ sranddev(void)
mib[0] = CTL_KERN;
mib[1] = KERN_ARND;
sysctl(mib, 2, (void *)&next, &len, NULL, 0);
-#ifndef USE_WEAK_SEEDING
- /* Transform to [1, 0x7ffffffe] range. */
- next = (next % 0x7ffffffe) + 1;
-#endif
}