]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - lib/libc/gen/_rand48.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / lib / libc / gen / _rand48.c
1 /*
2  * Copyright (c) 1993 Martin Birgmeier
3  * All rights reserved.
4  *
5  * You may redistribute unmodified or modified versions of this source
6  * code provided that the above copyright notice and this and the
7  * following conditions are retained.
8  *
9  * This software is provided ``as is'', and comes with no warranties
10  * of any kind. I shall in no event be liable for anything that happens
11  * to anyone/anything when using this software.
12  */
13
14 #include <sys/cdefs.h>
15 __FBSDID("$FreeBSD$");
16
17 #include "rand48.h"
18
19 unsigned short _rand48_seed[3] = {
20         RAND48_SEED_0,
21         RAND48_SEED_1,
22         RAND48_SEED_2
23 };
24 unsigned short _rand48_mult[3] = {
25         RAND48_MULT_0,
26         RAND48_MULT_1,
27         RAND48_MULT_2
28 };
29 unsigned short _rand48_add = RAND48_ADD;
30
31 void
32 _dorand48(unsigned short xseed[3])
33 {
34         unsigned long accu;
35         unsigned short temp[2];
36
37         accu = (unsigned long) _rand48_mult[0] * (unsigned long) xseed[0] +
38          (unsigned long) _rand48_add;
39         temp[0] = (unsigned short) accu;        /* lower 16 bits */
40         accu >>= sizeof(unsigned short) * 8;
41         accu += (unsigned long) _rand48_mult[0] * (unsigned long) xseed[1] +
42          (unsigned long) _rand48_mult[1] * (unsigned long) xseed[0];
43         temp[1] = (unsigned short) accu;        /* middle 16 bits */
44         accu >>= sizeof(unsigned short) * 8;
45         accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0];
46         xseed[0] = temp[0];
47         xseed[1] = temp[1];
48         xseed[2] = (unsigned short) accu;
49 }