random_gen.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: random_gen.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:40:20  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: random_gen.cpp,v 1000.1 2004/06/01 19:40:20 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors: Clifford Clausen, Denis Vakatov, Jim Ostell, Jonathan Kans,
  35.  *          Greg Schuler
  36.  * Contact: Clifford Clausen
  37.  *
  38.  * File Description:
  39.  *   CRandom is a lagged Fibonacci (LFG) random number generator (RNG)
  40.  *   with lags 33 and 13, modulus 2^31, and operation '+'. It is a slightly
  41.  *   modified version of Nlm_Random() found in the NCBI C toolkit.
  42.  *   It generates uniform random numbers between 0 and 2^31 - 1 (inclusive).
  43.  *
  44.  *   CRandom has been tested using the Diehard RNG test package
  45.  *   developed by George Marsaglia, Prof., Dept of Statistics, Florida
  46.  *   State University. CRandom in particular, and LFG type RNGs in general, 
  47.  *   cannot pass all of the Diehard RNG tests. Specifically, it fails the
  48.  *   "Birthday" test as do other LFG RNGs. CRandom performs as well as
  49.  *   other LFG RNGS, as provided in the Diehard test package. The LFG
  50.  *   class of RNGs was chosen as the RNG for the NCBI C++ Toolkit as it
  51.  *   provides the best tradeoff between time to generate a random number
  52.  *   and performance on tests for randomness.
  53.  *   
  54.  *   For a download of Diehard software and documentation
  55.  *   see http://stat.fsu.edu/~geo/diehard.html. 
  56.  *
  57.  *   For further information also see
  58.  *   http://random.mat.sbg.ac.at/,  
  59.  *   http://csep1.phy.ornl.gov/rn/rn.html, and
  60.  *   http://www.agner.org/random/.
  61.  *
  62.  *   Some relevant papers are:
  63.  *   1. Hellekalek, P.: "Inversive pseudorandom number generators: concepts
  64.  *   results, and links", In Alexopoulos, C and Kang, K, and Lilegdon, WR,
  65.  *   and Goldsman, D, editor(s), Proceedings of the 1995 Winter Simulation
  66.  *   Conference, pp 255-262, 1995.
  67.  *   2. Leeb, H: "Random Numbers for Computer Simulation", Master's thesis,
  68.  *   University of Salzburg, 1995.
  69.  *   3. Marsaglia, G., "A Current View of Random Number Generators",
  70.  *   Proceedings of 16th Symposium on the Interface, Atlanta, 1984, Elsevier
  71.  *   Press.
  72.  *   4. Marsaglia, G. "Monkey Tests for Random Number Generators", Computers
  73.  *   & Mathematics with Applications, Vol 9, pp. 1-10, 1993.
  74.  *
  75.  *   For a list of other published papers, see
  76.  *   http://random.mat.sbg.ac.at/literature and
  77.  *   http://www.evensen.org/marsaglia/.
  78.  *
  79.  *   class CRandom:: 
  80.  *
  81.  * ---------------------------------------------------------------------------
  82.  * $Log: random_gen.cpp,v $
  83.  * Revision 1000.1  2004/06/01 19:40:20  gouriano
  84.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  85.  *
  86.  * Revision 1.3  2004/05/17 21:06:02  gorelenk
  87.  * Added include of PCH ncbi_pch.hpp
  88.  *
  89.  * Revision 1.2  2001/07/05 16:55:41  vakatov
  90.  * Added typedef CRandom::TValue and CRandom::GetMax() to allow for
  91.  * seamless extension of this API in the future
  92.  *
  93.  * Revision 1.1  2001/07/03 18:35:30  clausen
  94.  * Initial check in
  95.  *
  96.  * ===========================================================================
  97.  */
  98. #include <ncbi_pch.hpp>
  99. #include <util/random_gen.hpp>
  100. BEGIN_NCBI_SCOPE
  101. const size_t CRandom::kStateSize = sizeof(CRandom::sm_State)
  102.     / sizeof(CRandom::sm_State[0]);
  103. const size_t kStateOffset = 12;
  104. const CRandom::TValue CRandom::sm_State[kStateSize] = {
  105.     0xd53f1852,  0xdfc78b83,  0x4f256096,  0xe643df7,
  106.     0x82c359bf,  0xc7794dfa,  0xd5e9ffaa,  0x2c8cb64a,
  107.     0x2f07b334,  0xad5a7eb5,  0x96dc0cde,  0x6fc24589,
  108.     0xa5853646,  0xe71576e2,  0xdae30df,   0xb09ce711,
  109.     0x5e56ef87,  0x4b4b0082,  0x6f4f340e,  0xc5bb17e8,
  110.     0xd788d765,  0x67498087,  0x9d7aba26,  0x261351d4,
  111.     0x411ee7ea,  0x393a263,   0x2c5a5835,  0xc115fcd8,
  112.     0x25e9132c,  0xd0c6e906,  0xc2bc5b2d,  0x6c065c98,
  113.     0x6e37bd55
  114. };
  115. CRandom::CRandom(void)
  116. {
  117.     Reset();
  118. }
  119. CRandom::CRandom(TValue seed)
  120. {
  121.     SetSeed(seed);
  122. }
  123. void CRandom::Reset(void)
  124. {
  125.     _ASSERT(sizeof(sm_State) / sizeof(sm_State[0]) == kStateSize);
  126.     _ASSERT(kStateOffset < kStateSize);
  127.     for (size_t i = 0;  i < kStateSize;  ++i) {
  128.         m_State[i] = sm_State[i];
  129.     }
  130.     m_RJ = &m_State[kStateOffset];
  131.     m_RK = &m_State[kStateSize - 1];
  132. }
  133. void CRandom::SetSeed(TValue seed)
  134. {
  135.     _ASSERT(kStateOffset < kStateSize);
  136.     m_State[0] = m_Seed = seed;
  137.     // linear congruential initializer
  138.     for (size_t i = 1;  i < kStateSize;  ++i) {
  139.         m_State[i] = 1103515245 * m_State[i-1] + 12345;
  140.     }
  141.     m_RJ = &m_State[kStateOffset];
  142.     m_RK = &m_State[kStateSize - 1];
  143.     for (size_t i = 0;  i < 10 * kStateSize;  ++i) {
  144.         GetRand();
  145.     }
  146. }
  147. END_NCBI_SCOPE