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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: random_gen.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 15:30:56  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef RANDOM_GEN__HPP
  10. #define RANDOM_GEN__HPP
  11. /*  $Id: random_gen.hpp,v 1000.0 2003/10/29 15:30:56 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors: Clifford Clausen, Denis Vakatov, Jim Ostell, Jonathan Kans,
  37.  *          Greg Schuler
  38.  * Contact: Clifford Clausen
  39.  *
  40.  * File Description:
  41.  *   CRandom implements a lagged Fibonacci (LFG) random number generator (RNG)
  42.  *   with lags 33 and 13, modulus 2^31, and operation '+'. It is a slightly
  43.  *   modified version of Nlm_Random() found in the NCBI C toolkit.
  44.  *   It generates uniform random numbers between 0 and 2^31 - 1 (inclusive).
  45.  *
  46.  *   More details and literature refs are provided in "random_gen.cpp".
  47.  *
  48.  *
  49.  * ---------------------------------------------------------------------------
  50.  * $Log: random_gen.hpp,v $
  51.  * Revision 1000.0  2003/10/29 15:30:56  gouriano
  52.  * PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.5
  53.  *
  54.  * Revision 1.5  2003/04/17 17:50:23  siyan
  55.  * Added doxygen support
  56.  *
  57.  * Revision 1.4  2002/12/19 14:51:00  dicuccio
  58.  * Added export specifier for Win32 DLL builds.
  59.  *
  60.  * Revision 1.3  2001/07/06 11:49:21  clausen
  61.  * Added GetRand(min,max)
  62.  *
  63.  * Revision 1.2  2001/07/05 16:55:40  vakatov
  64.  * Added typedef CRandom::TValue and CRandom::GetMax() to allow for
  65.  * seamless extension of this API in the future
  66.  *
  67.  * Revision 1.1  2001/07/03 18:36:07  clausen
  68.  * Initial check in
  69.  *
  70.  * ===========================================================================
  71.  */
  72. #include <corelib/ncbistd.hpp>
  73. /** @addtogroup RandomGen
  74.  *
  75.  * @{
  76.  */
  77. BEGIN_NCBI_SCOPE
  78. /////////////////////////////////////////////////////////////////////////////
  79. //  CRandom::
  80. //
  81. class NCBI_XUTIL_EXPORT CRandom
  82. {
  83. public:
  84.     // Type of the generated integer value and/or the seed value
  85.     typedef Uint4 TValue;
  86.     // Constructors
  87.     CRandom(void);
  88.     CRandom(TValue seed);
  89.     // Initialize and Seed the random number generator
  90.     void   SetSeed(TValue seed);
  91.     TValue GetSeed(void);
  92.     // Reset random number generator to initial startup condition
  93.     void Reset(void);
  94.     // Get the next random number in the interval [0..GetMax()] (inclusive)
  95.     TValue GetRand(void);
  96.     TValue GetRand(TValue min_value, TValue max_value); 
  97.     // The max. value GetRand() returns
  98.     static TValue GetMax(void);
  99. private:
  100.     // Static array used to initialize "m_State", and its size
  101.     static const TValue sm_State[33];
  102.     static const size_t kStateSize;
  103.     // Instance data members
  104.     TValue  m_State[sizeof(sm_State) / sizeof(sm_State[0])];
  105.     TValue* m_RJ;
  106.     TValue* m_RK;
  107.     TValue  m_Seed;
  108. };
  109. /* @} */
  110. /////////////////////////////////////////////////////////////////////////////
  111. //  IMPLEMENTATION of INLINE functions
  112. /////////////////////////////////////////////////////////////////////////////
  113. /////////////////////////////////////////////////////////////////////////////
  114. //  CRandom::
  115. //
  116. inline CRandom::TValue CRandom::GetSeed(void)
  117. {
  118.     return m_Seed;
  119. }
  120. inline CRandom::TValue CRandom::GetRand(void)
  121. {
  122.     register TValue r;
  123.     r = *m_RK;
  124.     r += *(m_RJ--);
  125.     *(m_RK--) = r;
  126.     if (m_RK < m_State) {
  127.         m_RK = &m_State[sizeof(m_State) / sizeof(m_State[0]) - 1];
  128.     }
  129.     else if (m_RJ < m_State) {
  130.         m_RJ = &m_State[sizeof(m_State) / sizeof(m_State[0]) - 1];
  131.     }
  132.     return (r >> 1) & 0x7fffffff;  // discard the least-random bit
  133. }
  134. inline CRandom::TValue CRandom::GetRand(TValue min_value, TValue max_value)
  135. {
  136.   return min_value + (GetRand() % (max_value - min_value + 1));
  137. }
  138. inline CRandom::TValue CRandom::GetMax(void)
  139. {
  140.     return 0x7fffffff;
  141. }
  142. END_NCBI_SCOPE
  143. #endif  /* RANDOM_GEN__HPP */