xref: /freebsd/lib/libc/gen/_rand48.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
14b4b7d05SGarrett Wollman /*
24b4b7d05SGarrett Wollman  * Copyright (c) 1993 Martin Birgmeier
34b4b7d05SGarrett Wollman  * All rights reserved.
44b4b7d05SGarrett Wollman  *
54b4b7d05SGarrett Wollman  * You may redistribute unmodified or modified versions of this source
64b4b7d05SGarrett Wollman  * code provided that the above copyright notice and this and the
74b4b7d05SGarrett Wollman  * following conditions are retained.
84b4b7d05SGarrett Wollman  *
94b4b7d05SGarrett Wollman  * This software is provided ``as is'', and comes with no warranties
104b4b7d05SGarrett Wollman  * of any kind. I shall in no event be liable for anything that happens
114b4b7d05SGarrett Wollman  * to anyone/anything when using this software.
124b4b7d05SGarrett Wollman  */
134b4b7d05SGarrett Wollman 
144b4b7d05SGarrett Wollman #include "rand48.h"
154b4b7d05SGarrett Wollman 
164b4b7d05SGarrett Wollman unsigned short _rand48_seed[3] = {
174b4b7d05SGarrett Wollman 	RAND48_SEED_0,
184b4b7d05SGarrett Wollman 	RAND48_SEED_1,
194b4b7d05SGarrett Wollman 	RAND48_SEED_2
204b4b7d05SGarrett Wollman };
214b4b7d05SGarrett Wollman unsigned short _rand48_mult[3] = {
224b4b7d05SGarrett Wollman 	RAND48_MULT_0,
234b4b7d05SGarrett Wollman 	RAND48_MULT_1,
244b4b7d05SGarrett Wollman 	RAND48_MULT_2
254b4b7d05SGarrett Wollman };
264b4b7d05SGarrett Wollman unsigned short _rand48_add = RAND48_ADD;
274b4b7d05SGarrett Wollman 
284b4b7d05SGarrett Wollman void
_dorand48(unsigned short xseed[3])294b4b7d05SGarrett Wollman _dorand48(unsigned short xseed[3])
304b4b7d05SGarrett Wollman {
314b4b7d05SGarrett Wollman 	unsigned long accu;
324b4b7d05SGarrett Wollman 	unsigned short temp[2];
334b4b7d05SGarrett Wollman 
344b4b7d05SGarrett Wollman 	accu = (unsigned long) _rand48_mult[0] * (unsigned long) xseed[0] +
354b4b7d05SGarrett Wollman 	 (unsigned long) _rand48_add;
364b4b7d05SGarrett Wollman 	temp[0] = (unsigned short) accu;	/* lower 16 bits */
374b4b7d05SGarrett Wollman 	accu >>= sizeof(unsigned short) * 8;
384b4b7d05SGarrett Wollman 	accu += (unsigned long) _rand48_mult[0] * (unsigned long) xseed[1] +
394b4b7d05SGarrett Wollman 	 (unsigned long) _rand48_mult[1] * (unsigned long) xseed[0];
404b4b7d05SGarrett Wollman 	temp[1] = (unsigned short) accu;	/* middle 16 bits */
414b4b7d05SGarrett Wollman 	accu >>= sizeof(unsigned short) * 8;
424b4b7d05SGarrett Wollman 	accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0];
434b4b7d05SGarrett Wollman 	xseed[0] = temp[0];
444b4b7d05SGarrett Wollman 	xseed[1] = temp[1];
454b4b7d05SGarrett Wollman 	xseed[2] = (unsigned short) accu;
464b4b7d05SGarrett Wollman }
47