random.cc revision 1971
17199Sgblack@eecs.umich.edu/* 27199Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 37199Sgblack@eecs.umich.edu * All rights reserved. 47199Sgblack@eecs.umich.edu * 57199Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67199Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77199Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87199Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97199Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107199Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117199Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127199Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137199Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147199Sgblack@eecs.umich.edu * this software without specific prior written permission. 157199Sgblack@eecs.umich.edu * 167199Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177199Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187199Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197199Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207199Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217199Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227199Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237199Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247199Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257199Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267199Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277199Sgblack@eecs.umich.edu */ 287199Sgblack@eecs.umich.edu 297199Sgblack@eecs.umich.edu#include <cstdlib> 307199Sgblack@eecs.umich.edu#include <cmath> 317199Sgblack@eecs.umich.edu 327199Sgblack@eecs.umich.edu#include "sim/param.hh" 337199Sgblack@eecs.umich.edu#include "base/random.hh" 347199Sgblack@eecs.umich.edu#include "base/trace.hh" 357199Sgblack@eecs.umich.edu 367199Sgblack@eecs.umich.eduusing namespace std; 377199Sgblack@eecs.umich.edu 387199Sgblack@eecs.umich.educlass RandomContext : public ParamContext 397199Sgblack@eecs.umich.edu{ 407199Sgblack@eecs.umich.edu public: 417199Sgblack@eecs.umich.edu RandomContext(const string &_iniSection) 427199Sgblack@eecs.umich.edu : ::ParamContext(_iniSection) {} 437199Sgblack@eecs.umich.edu ~RandomContext() {} 447199Sgblack@eecs.umich.edu 457199Sgblack@eecs.umich.edu void checkParams(); 467199Sgblack@eecs.umich.edu}; 477199Sgblack@eecs.umich.edu 487199Sgblack@eecs.umich.eduRandomContext paramContext("random"); 497199Sgblack@eecs.umich.edu 507199Sgblack@eecs.umich.eduParam<unsigned> 517199Sgblack@eecs.umich.eduseed(¶mContext, "seed", "seed to random number generator", 1); 527199Sgblack@eecs.umich.edu 537199Sgblack@eecs.umich.eduvoid 547199Sgblack@eecs.umich.eduRandomContext::checkParams() 557199Sgblack@eecs.umich.edu{ 567199Sgblack@eecs.umich.edu ::srand48(seed); 577199Sgblack@eecs.umich.edu} 587202Sgblack@eecs.umich.edu 597202Sgblack@eecs.umich.edulong 607202Sgblack@eecs.umich.edugetLong() 617202Sgblack@eecs.umich.edu{ 627202Sgblack@eecs.umich.edu return mrand48(); 637202Sgblack@eecs.umich.edu} 647202Sgblack@eecs.umich.edu 657202Sgblack@eecs.umich.eduint64_t 667202Sgblack@eecs.umich.edugetUniform(int64_t min, int64_t max) 677202Sgblack@eecs.umich.edu{ 687202Sgblack@eecs.umich.edu double r; 697202Sgblack@eecs.umich.edu r = drand48() * (max-min) + min; 707202Sgblack@eecs.umich.edu return (int64_t)round(r); 717202Sgblack@eecs.umich.edu} 727202Sgblack@eecs.umich.edu 737202Sgblack@eecs.umich.eduuint64_t 747202Sgblack@eecs.umich.edugetUniformPos(uint64_t min, uint64_t max) 757202Sgblack@eecs.umich.edu{ 767202Sgblack@eecs.umich.edu double r; 777202Sgblack@eecs.umich.edu r = drand48() * (max-min) + min; 787202Sgblack@eecs.umich.edu return (uint64_t)round(r); 797202Sgblack@eecs.umich.edu} 807202Sgblack@eecs.umich.edu 817202Sgblack@eecs.umich.edu 827202Sgblack@eecs.umich.edu// idea for generating a double from erand48 837202Sgblack@eecs.umich.edudouble 847202Sgblack@eecs.umich.edugetDouble() 857202Sgblack@eecs.umich.edu{ 867202Sgblack@eecs.umich.edu union { 877202Sgblack@eecs.umich.edu uint32_t _long[2]; 887202Sgblack@eecs.umich.edu uint16_t _short[4]; 897202Sgblack@eecs.umich.edu }; 907202Sgblack@eecs.umich.edu 917202Sgblack@eecs.umich.edu _long[0] = mrand48(); 927202Sgblack@eecs.umich.edu _long[1] = mrand48(); 937202Sgblack@eecs.umich.edu 947202Sgblack@eecs.umich.edu return ldexp((double) _short[0], -48) + 957202Sgblack@eecs.umich.edu ldexp((double) _short[1], -32) + 967202Sgblack@eecs.umich.edu ldexp((double) _short[2], -16); 977202Sgblack@eecs.umich.edu} 987202Sgblack@eecs.umich.edu