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