mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-20 15:26:43 +01:00
Added *ran48 functions, and put them in the correct place this time.
Obtained from: 1.1.5
This commit is contained in:
parent
e98e6beea3
commit
4b4b7d0556
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=3016
@ -1,4 +1,5 @@
|
||||
# @(#)Makefile.inc 8.3 (Berkeley) 4/16/94
|
||||
# From: @(#)Makefile.inc 8.3 (Berkeley) 4/16/94
|
||||
# $Id$
|
||||
|
||||
# machine-independent gen sources
|
||||
.PATH: ${.CURDIR}/${MACHINE}/gen ${.CURDIR}/gen
|
||||
@ -19,6 +20,10 @@ SRCS+= alarm.c assert.c clock.c closedir.c confstr.c crypt.c ctermid.c \
|
||||
ualarm.c uname.c unvis.c usleep.c utime.c valloc.c vis.c wait.c \
|
||||
wait3.c waitpid.c getvfsent.c
|
||||
|
||||
# *rand48 family, from 1.1.5
|
||||
SRCS+= _rand48.c drand48.c erand48.c jrand48.c lcong48.c lrand48.c \
|
||||
mrand48.c nrand48.c seed48.c srand48.c
|
||||
|
||||
# machine-dependent gen sources
|
||||
.include "${.CURDIR}/${MACHINE}/gen/Makefile.inc"
|
||||
|
||||
@ -39,7 +44,7 @@ MAN3+= gen/alarm.3 gen/clock.3 gen/confstr.3 gen/crypt.3 gen/ctermid.3 \
|
||||
gen/getpwent.3 gen/getttyent.3 gen/getusershell.3 gen/glob.3 \
|
||||
gen/initgroups.3 gen/isinf.3 gen/ldexp.3 gen/modf.3 gen/nice.3 \
|
||||
gen/nlist.3 gen/pause.3 gen/popen.3 gen/psignal.3 gen/pwcache.3 \
|
||||
gen/raise.3 gen/scandir.3 gen/setjmp.3 gen/setmode.3 \
|
||||
gen/raise.3 gen/rand48.3 gen/scandir.3 gen/setjmp.3 gen/setmode.3 \
|
||||
gen/siginterrupt.3 gen/signal.3 gen/sigsetops.3 gen/sleep.3 \
|
||||
gen/sysconf.3 gen/sysctl.3 gen/syslog.3 gen/tcgetpgrp.3 \
|
||||
gen/tcsendbreak.3 gen/tcsetattr.3 gen/tcsetpgrp.3 gen/time.3 \
|
||||
@ -75,6 +80,10 @@ MLINKS+=glob.3 globfree.3
|
||||
MLINKS+=popen.3 pclose.3
|
||||
MLINKS+=psignal.3 sys_siglist.3
|
||||
MLINKS+=pwcache.3 user_from_uid.3 pwcache.3 group_from_gid.3
|
||||
MLINKS+=rand48.3 _rand48.3 rand48.3 drand48.3 rand48.3 erand48.3 \
|
||||
rand48.3 jrand48.3 rand48.3 lcong48.3 rand48.3 lrand48.3 \
|
||||
rand48.3 mrand48.3 rand48.3 nrand48.3 rand48.3 seed48.3 \
|
||||
rand48.3 srand48.3
|
||||
MLINKS+=scandir.3 alphasort.3
|
||||
MLINKS+=setjmp.3 _longjmp.3 setjmp.3 _setjmp.3 setjmp.3 longjmp.3 \
|
||||
setjmp.3 longjmperr.3 setjmp.3 longjmperror.3 \
|
||||
|
46
lib/libc/gen/_rand48.c
Normal file
46
lib/libc/gen/_rand48.c
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
unsigned short _rand48_seed[3] = {
|
||||
RAND48_SEED_0,
|
||||
RAND48_SEED_1,
|
||||
RAND48_SEED_2
|
||||
};
|
||||
unsigned short _rand48_mult[3] = {
|
||||
RAND48_MULT_0,
|
||||
RAND48_MULT_1,
|
||||
RAND48_MULT_2
|
||||
};
|
||||
unsigned short _rand48_add = RAND48_ADD;
|
||||
|
||||
void
|
||||
_dorand48(unsigned short xseed[3])
|
||||
{
|
||||
unsigned long accu;
|
||||
unsigned short temp[2];
|
||||
|
||||
accu = (unsigned long) _rand48_mult[0] * (unsigned long) xseed[0] +
|
||||
(unsigned long) _rand48_add;
|
||||
temp[0] = (unsigned short) accu; /* lower 16 bits */
|
||||
accu >>= sizeof(unsigned short) * 8;
|
||||
accu += (unsigned long) _rand48_mult[0] * (unsigned long) xseed[1] +
|
||||
(unsigned long) _rand48_mult[1] * (unsigned long) xseed[0];
|
||||
temp[1] = (unsigned short) accu; /* middle 16 bits */
|
||||
accu >>= sizeof(unsigned short) * 8;
|
||||
accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0];
|
||||
xseed[0] = temp[0];
|
||||
xseed[1] = temp[1];
|
||||
xseed[2] = (unsigned short) accu;
|
||||
}
|
22
lib/libc/gen/drand48.c
Normal file
22
lib/libc/gen/drand48.c
Normal file
@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
extern unsigned short _rand48_seed[3];
|
||||
|
||||
double
|
||||
drand48(void)
|
||||
{
|
||||
return erand48(_rand48_seed);
|
||||
}
|
23
lib/libc/gen/erand48.c
Normal file
23
lib/libc/gen/erand48.c
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
double
|
||||
erand48(unsigned short xseed[3])
|
||||
{
|
||||
_dorand48(xseed);
|
||||
return ldexp((double) xseed[0], -48) +
|
||||
ldexp((double) xseed[1], -32) +
|
||||
ldexp((double) xseed[2], -16);
|
||||
}
|
21
lib/libc/gen/jrand48.c
Normal file
21
lib/libc/gen/jrand48.c
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
long
|
||||
jrand48(unsigned short xseed[3])
|
||||
{
|
||||
_dorand48(xseed);
|
||||
return ((long) xseed[2] << 16) + (long) xseed[1];
|
||||
}
|
30
lib/libc/gen/lcong48.c
Normal file
30
lib/libc/gen/lcong48.c
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
extern unsigned short _rand48_seed[3];
|
||||
extern unsigned short _rand48_mult[3];
|
||||
extern unsigned short _rand48_add;
|
||||
|
||||
void
|
||||
lcong48(unsigned short p[7])
|
||||
{
|
||||
_rand48_seed[0] = p[0];
|
||||
_rand48_seed[1] = p[1];
|
||||
_rand48_seed[2] = p[2];
|
||||
_rand48_mult[0] = p[3];
|
||||
_rand48_mult[1] = p[4];
|
||||
_rand48_mult[2] = p[5];
|
||||
_rand48_add = p[6];
|
||||
}
|
23
lib/libc/gen/lrand48.c
Normal file
23
lib/libc/gen/lrand48.c
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
extern unsigned short _rand48_seed[3];
|
||||
|
||||
long
|
||||
lrand48(void)
|
||||
{
|
||||
_dorand48(_rand48_seed);
|
||||
return ((long) _rand48_seed[2] << 15) + ((long) _rand48_seed[1] >> 1);
|
||||
}
|
23
lib/libc/gen/mrand48.c
Normal file
23
lib/libc/gen/mrand48.c
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
extern unsigned short _rand48_seed[3];
|
||||
|
||||
long
|
||||
mrand48(void)
|
||||
{
|
||||
_dorand48(_rand48_seed);
|
||||
return ((long) _rand48_seed[2] << 16) + (long) _rand48_seed[1];
|
||||
}
|
21
lib/libc/gen/nrand48.c
Normal file
21
lib/libc/gen/nrand48.c
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
long
|
||||
nrand48(unsigned short xseed[3])
|
||||
{
|
||||
_dorand48(xseed);
|
||||
return ((long) xseed[2] << 15) + ((long) xseed[1] >> 1);
|
||||
}
|
160
lib/libc/gen/rand48.3
Normal file
160
lib/libc/gen/rand48.3
Normal file
@ -0,0 +1,160 @@
|
||||
\" Copyright (c) 1993 Martin Birgmeier
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" You may redistribute unmodified or modified versions of this source
|
||||
.\" code provided that the above copyright notice and this and the
|
||||
.\" following conditions are retained.
|
||||
.\"
|
||||
.\" This software is provided ``as is'', and comes with no warranties
|
||||
.\" of any kind. I shall in no event be liable for anything that happens
|
||||
.\" to anyone/anything when using this software.
|
||||
.\"
|
||||
.\" @(#)rand48.3 V1.0 MB 8 Oct 1993
|
||||
.\"
|
||||
.Dd October 8, 1993
|
||||
.Dt RAND48 3
|
||||
.Os FreeBSD
|
||||
.Sh NAME
|
||||
.Nm drand48 ,
|
||||
.Nm erand48 ,
|
||||
.Nm lrand48 ,
|
||||
.Nm nrand48 ,
|
||||
.Nm mrand48 ,
|
||||
.Nm jrand48 ,
|
||||
.Nm srand48 ,
|
||||
.Nm seed48 ,
|
||||
.Nm lcong48
|
||||
.Nd pseudo random number generators and initialization routines
|
||||
.Sh SYNOPSIS
|
||||
.Fd #include <stdlib.h>
|
||||
.Ft double
|
||||
.Fn drand48 void
|
||||
.Ft double
|
||||
.Fn erand48 "unsigned short xseed[3]"
|
||||
.Ft long
|
||||
.Fn lrand48 void
|
||||
.Ft long
|
||||
.Fn nrand48 "unsigned short xseed[3]"
|
||||
.Ft long
|
||||
.Fn mrand48 void
|
||||
.Ft long
|
||||
.Fn jrand48 "unsigned short xseed[3]"
|
||||
.Ft void
|
||||
.Fn srand48 "long seed"
|
||||
.Ft "unsigned short *"
|
||||
.Fn seed48 "unsigned short xseed[3]"
|
||||
.Ft void
|
||||
.Fn lcong48 "unsigned short p[7]"
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Fn rand48
|
||||
family of functions generates pseudo-random numbers using a linear
|
||||
congruential algorithm working on integers 48 bits in size. The
|
||||
particular formula employed is
|
||||
r(n+1) = (a * r(n) + c) mod m
|
||||
where the default values are
|
||||
for the multiplicand a = 0xfdeece66d = 25214903917 and
|
||||
the addend c = 0xb = 11. The modul is always fixed at m = 2 ** 48.
|
||||
r(n) is called the seed of the random number generator.
|
||||
.Pp
|
||||
For all the six generator routines described next, the first
|
||||
computational step is to perform a single iteration of the algorithm.
|
||||
.Pp
|
||||
.Fn drand48
|
||||
and
|
||||
.Fn erand48
|
||||
return values of type double. The full 48 bits of r(n+1) are
|
||||
loaded into the mantissa of the returned value, with the exponent set
|
||||
such that the values produced lie in the interval [0.0, 1.0).
|
||||
.Pp
|
||||
.Fn lrand48
|
||||
and
|
||||
.Fn nrand48
|
||||
return values of type long in the range
|
||||
[-2**31, 2**31-1]. The high-order (32) bits of
|
||||
r(n+1) are loaded into the returned value.
|
||||
.Pp
|
||||
.Fn mrand48
|
||||
and
|
||||
.Fn jrand48
|
||||
return values of type long in the range
|
||||
[0, 2**31-1]. The high-order (31) bits of
|
||||
r(n+1) are loaded into the lower bits of the returned value, with
|
||||
the topmost (sign) bit set to zero.
|
||||
.Pp
|
||||
.Fn drand48 ,
|
||||
.Fn lrand48 ,
|
||||
and
|
||||
.Fn mrand48
|
||||
use an internal buffer to store r(n). For these functions
|
||||
the initial value of r(0) = 0x1234abcd330e = 20017429951246.
|
||||
.Pp
|
||||
On the other hand,
|
||||
.Fn erand48 ,
|
||||
.Fn nrand48 ,
|
||||
and
|
||||
.Fn jrand48
|
||||
use a user-supplied buffer to store the seed r(n),
|
||||
which consists of an array of 3 shorts, where the zeroth member
|
||||
holds the least significant bits.
|
||||
.Pp
|
||||
All functions share the same multiplicand and addend.
|
||||
.Pp
|
||||
.Fn srand48
|
||||
is used to initialize the internal buffer r(n) of
|
||||
.Fn drand48 ,
|
||||
.Fn lrand48 ,
|
||||
and
|
||||
.Fn mrand48
|
||||
such that the 32 bits of the seed value are copied into the upper 32 bits
|
||||
of r(n), with the lower 16 bits of r(n) arbitrarily being set to 0x330e.
|
||||
Additionally, the constant multiplicand and addend of the algorithm are
|
||||
reset to the default values given above.
|
||||
.Pp
|
||||
.Fn seed48
|
||||
also initializes the internal buffer r(n) of
|
||||
.Fn drand48 ,
|
||||
.Fn lrand48 ,
|
||||
and
|
||||
.Fn mrand48 ,
|
||||
but here all 48 bits of the seed can be specified in an array of 3 shorts,
|
||||
where the zeroth member specifies the lowest bits. Again,
|
||||
the constant multiplicand and addend of the algorithm are
|
||||
reset to the default values given above.
|
||||
.Fn seed48
|
||||
returns a pointer to an array of 3 shorts which contains the old seed.
|
||||
This array is statically allocated, thus its contents are lost after
|
||||
each new call to
|
||||
.Fn seed48 .
|
||||
.Pp
|
||||
Finally,
|
||||
.Fn lcong48
|
||||
allows full control over the multiplicand and addend used in
|
||||
.Fn drand48 ,
|
||||
.Fn erand48 ,
|
||||
.Fn lrand48 ,
|
||||
.Fn nrand48 ,
|
||||
.Fn mrand48 ,
|
||||
and
|
||||
.Fn jrand48 ,
|
||||
and the seed used in
|
||||
.Fn drand48 ,
|
||||
.Fn lrand48 ,
|
||||
and
|
||||
.Fn mrand48 .
|
||||
An array of 7 shorts is passed as parameter; the first three shorts are
|
||||
used to initialize the seed; the second three are used to initialize the
|
||||
multiplicand; and the last short is used to initialize the addend.
|
||||
It is thus not possible to use values greater than 0xffff as the addend.
|
||||
.Pp
|
||||
Note that all three methods of seeding the random number generator
|
||||
always also set the multiplicand and addend for any of the six
|
||||
generator calls.
|
||||
.Pp
|
||||
For a more powerful random number generator, see
|
||||
.Xr random 3
|
||||
.Sh AUTHOR
|
||||
Martin Birgmeier
|
||||
.Sh SEE ALSO
|
||||
.Xr rand 3 ,
|
||||
.Xr random 3 .
|
30
lib/libc/gen/rand48.h
Normal file
30
lib/libc/gen/rand48.h
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#ifndef _RAND48_H_
|
||||
#define _RAND48_H_
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void _dorand48 __P((unsigned short[3]));
|
||||
|
||||
#define RAND48_SEED_0 (0x330e)
|
||||
#define RAND48_SEED_1 (0xabcd)
|
||||
#define RAND48_SEED_2 (0x1234)
|
||||
#define RAND48_MULT_0 (0xe66d)
|
||||
#define RAND48_MULT_1 (0xdeec)
|
||||
#define RAND48_MULT_2 (0x0005)
|
||||
#define RAND48_ADD (0x000b)
|
||||
|
||||
#endif /* _RAND48_H_ */
|
36
lib/libc/gen/seed48.c
Normal file
36
lib/libc/gen/seed48.c
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
extern unsigned short _rand48_seed[3];
|
||||
extern unsigned short _rand48_mult[3];
|
||||
extern unsigned short _rand48_add;
|
||||
|
||||
unsigned short *
|
||||
seed48(unsigned short xseed[3])
|
||||
{
|
||||
static unsigned short sseed[3];
|
||||
|
||||
sseed[0] = _rand48_seed[0];
|
||||
sseed[1] = _rand48_seed[1];
|
||||
sseed[2] = _rand48_seed[2];
|
||||
_rand48_seed[0] = xseed[0];
|
||||
_rand48_seed[1] = xseed[1];
|
||||
_rand48_seed[2] = xseed[2];
|
||||
_rand48_mult[0] = RAND48_MULT_0;
|
||||
_rand48_mult[1] = RAND48_MULT_1;
|
||||
_rand48_mult[2] = RAND48_MULT_2;
|
||||
_rand48_add = RAND48_ADD;
|
||||
return sseed;
|
||||
}
|
30
lib/libc/gen/srand48.c
Normal file
30
lib/libc/gen/srand48.c
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 1993 Martin Birgmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* You may redistribute unmodified or modified versions of this source
|
||||
* code provided that the above copyright notice and this and the
|
||||
* following conditions are retained.
|
||||
*
|
||||
* This software is provided ``as is'', and comes with no warranties
|
||||
* of any kind. I shall in no event be liable for anything that happens
|
||||
* to anyone/anything when using this software.
|
||||
*/
|
||||
|
||||
#include "rand48.h"
|
||||
|
||||
extern unsigned short _rand48_seed[3];
|
||||
extern unsigned short _rand48_mult[3];
|
||||
extern unsigned short _rand48_add;
|
||||
|
||||
void
|
||||
srand48(long seed)
|
||||
{
|
||||
_rand48_seed[0] = RAND48_SEED_0;
|
||||
_rand48_seed[1] = (unsigned short) seed;
|
||||
_rand48_seed[2] = (unsigned short) (seed >> 16);
|
||||
_rand48_mult[0] = RAND48_MULT_0;
|
||||
_rand48_mult[1] = RAND48_MULT_1;
|
||||
_rand48_mult[2] = RAND48_MULT_2;
|
||||
_rand48_add = RAND48_ADD;
|
||||
}
|
Loading…
Reference in New Issue
Block a user