imgtools/imglib/boostlibrary/boost/tr1/random.hpp
changeset 600 6d08f4a05d93
equal deleted inserted replaced
599:fa7a3cc6effd 600:6d08f4a05d93
       
     1 //  (C) Copyright John Maddock 2005.
       
     2 //  (C) Copyright Henry S. Warren 2005.
       
     3 //  Use, modification and distribution are subject to the
       
     4 //  Boost Software License, Version 1.0. (See accompanying file
       
     5 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       
     6 
       
     7 #ifndef BOOST_TR1_RANDOM_HPP_INCLUDED
       
     8 #  define BOOST_TR1_RANDOM_HPP_INCLUDED
       
     9 #  include <boost/tr1/detail/config.hpp>
       
    10 
       
    11 #ifdef BOOST_HAS_TR1_RANDOM
       
    12 #  ifdef BOOST_HAS_INCLUDE_NEXT
       
    13 #     include_next BOOST_TR1_HEADER(random)
       
    14 #  else
       
    15 #     include <boost/tr1/detail/config_all.hpp>
       
    16 #     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(random))
       
    17 #  endif
       
    18 #else
       
    19 // Boost.Random:
       
    20 #include <boost/random.hpp>
       
    21 #ifndef __SUNPRO_CC
       
    22     // Sunpros linker complains if we so much as include this...
       
    23 #   include <boost/nondet_random.hpp>
       
    24 #endif
       
    25 #include <boost/tr1/detail/functor2iterator.hpp>
       
    26 #include <boost/type_traits/is_fundamental.hpp>
       
    27 #include <boost/type_traits/is_same.hpp>
       
    28 
       
    29 namespace std { namespace tr1{
       
    30 
       
    31 using ::boost::variate_generator;
       
    32 
       
    33 template<class UIntType, UIntType a, UIntType c, UIntType m>
       
    34 class linear_congruential
       
    35 {
       
    36 private:
       
    37    typedef ::boost::random::linear_congruential<UIntType, a, c, m, 0> impl_type;
       
    38 public:
       
    39    // types
       
    40    typedef UIntType result_type;
       
    41    // parameter values
       
    42    BOOST_STATIC_CONSTANT(UIntType, multiplier = a);
       
    43    BOOST_STATIC_CONSTANT(UIntType, increment = c);
       
    44    BOOST_STATIC_CONSTANT(UIntType, modulus = m);
       
    45    // constructors and member function
       
    46    explicit linear_congruential(unsigned long x0 = 1)
       
    47       : m_gen(x0){}
       
    48    linear_congruential(const linear_congruential& that)
       
    49       : m_gen(that.m_gen){}
       
    50    template<class Gen> linear_congruential(Gen& g)
       
    51    {
       
    52       init1(g, ::boost::is_same<Gen,linear_congruential>());
       
    53    }
       
    54    void seed(unsigned long x0 = 1)
       
    55    { m_gen.seed(x0); }
       
    56    template<class Gen> void seed(Gen& g)
       
    57    { 
       
    58       init2(g, ::boost::is_fundamental<Gen>());
       
    59    }
       
    60    result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
    61    { return (m_gen.min)(); }
       
    62    result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
    63    { return (m_gen.max)(); }
       
    64    result_type operator()()
       
    65    {
       
    66       return m_gen(); 
       
    67    }
       
    68    bool operator==(const linear_congruential& that)const
       
    69    { return m_gen == that.m_gen; }
       
    70    bool operator!=(const linear_congruential& that)const
       
    71    { return m_gen != that.m_gen; }
       
    72 
       
    73 #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
       
    74   template<class CharT, class Traits>
       
    75   friend std::basic_ostream<CharT,Traits>&
       
    76   operator<<(std::basic_ostream<CharT,Traits>& os,
       
    77              const linear_congruential& lcg)
       
    78   {
       
    79     return os << lcg.m_gen; 
       
    80   }
       
    81 
       
    82   template<class CharT, class Traits>
       
    83   friend std::basic_istream<CharT,Traits>&
       
    84   operator>>(std::basic_istream<CharT,Traits>& is,
       
    85              linear_congruential& lcg)
       
    86   {
       
    87     return is >> lcg.m_gen;
       
    88   }
       
    89 #endif
       
    90 
       
    91 private:
       
    92    template <class Gen>
       
    93    void init1(Gen& g, const ::boost::true_type&)
       
    94    {
       
    95       m_gen = g.m_gen;
       
    96    }
       
    97    template <class Gen>
       
    98    void init1(Gen& g, const ::boost::false_type&)
       
    99    {
       
   100       init2(g, ::boost::is_fundamental<Gen>());
       
   101    }
       
   102    template <class Gen>
       
   103    void init2(Gen& g, const ::boost::true_type&)
       
   104    {
       
   105       m_gen.seed(static_cast<unsigned long>(g));
       
   106    }
       
   107    template <class Gen>
       
   108    void init2(Gen& g, const ::boost::false_type&)
       
   109    {
       
   110       //typedef typename Gen::result_type gen_rt;
       
   111       boost::tr1_details::functor2iterator<Gen, unsigned long> f1(g), f2;
       
   112       m_gen.seed(f1, f2);
       
   113    }
       
   114    impl_type m_gen;
       
   115 };
       
   116 
       
   117 template<class UIntType, int w, int n, int m, int r,
       
   118 UIntType a, int u, int s, UIntType b, int t, UIntType c, int l>
       
   119 class mersenne_twister
       
   120 {
       
   121    typedef ::boost::random::mersenne_twister
       
   122       <UIntType, w, n, m, r, a, u, s, b, t, c, l, 0> imp_type;
       
   123 public:
       
   124    // types
       
   125    typedef UIntType result_type;
       
   126    // parameter values
       
   127    BOOST_STATIC_CONSTANT(int, word_size = w);
       
   128    BOOST_STATIC_CONSTANT(int, state_size = n);
       
   129    BOOST_STATIC_CONSTANT(int, shift_size = m);
       
   130    BOOST_STATIC_CONSTANT(int, mask_bits = r);
       
   131    BOOST_STATIC_CONSTANT(UIntType, parameter_a = a);
       
   132    BOOST_STATIC_CONSTANT(int, output_u = u);
       
   133    BOOST_STATIC_CONSTANT(int, output_s = s);
       
   134    BOOST_STATIC_CONSTANT(UIntType, output_b = b);
       
   135    BOOST_STATIC_CONSTANT(int, output_t = t);
       
   136    BOOST_STATIC_CONSTANT(UIntType, output_c = c);
       
   137    BOOST_STATIC_CONSTANT(int, output_l = l);
       
   138    // constructors and member function
       
   139    mersenne_twister(){}
       
   140    explicit mersenne_twister(unsigned long value)
       
   141       : m_gen(value == 0 ? 5489UL : value){}
       
   142    template<class Gen> mersenne_twister(Gen& g)
       
   143    {
       
   144       init1(g, ::boost::is_same<mersenne_twister,Gen>());
       
   145    }
       
   146    void seed()
       
   147    { m_gen.seed(); }
       
   148    void seed(unsigned long value)
       
   149    { m_gen.seed(value == 0 ? 5489UL : value); }
       
   150    template<class Gen> void seed(Gen& g)
       
   151    { init2(g, ::boost::is_fundamental<Gen>()); }
       
   152    result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   153    { return (m_gen.min)(); }
       
   154    result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   155    { return (m_gen.max)(); }
       
   156    result_type operator()()
       
   157    { return m_gen(); }
       
   158    bool operator==(const mersenne_twister& that)const
       
   159    { return m_gen == that.m_gen; }
       
   160    bool operator!=(const mersenne_twister& that)const
       
   161    { return m_gen != that.m_gen; }
       
   162 
       
   163 #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
       
   164    template<class CharT, class Traits>
       
   165    friend std::basic_ostream<CharT,Traits>&
       
   166    operator<<(std::basic_ostream<CharT,Traits>& os,
       
   167             const mersenne_twister& lcg)
       
   168    {
       
   169       return os << lcg.m_gen;
       
   170    }
       
   171 
       
   172    template<class CharT, class Traits>
       
   173    friend std::basic_istream<CharT,Traits>&
       
   174    operator>>(std::basic_istream<CharT,Traits>& is,
       
   175             mersenne_twister& lcg)
       
   176    {
       
   177       return is >> lcg.m_gen;
       
   178    }
       
   179 #endif
       
   180 private:
       
   181    template <class Gen>
       
   182    void init1(Gen& g, const ::boost::true_type&)
       
   183    {
       
   184       m_gen = g.m_gen;
       
   185    }
       
   186    template <class Gen>
       
   187    void init1(Gen& g, const ::boost::false_type&)
       
   188    {
       
   189       init2(g, ::boost::is_fundamental<Gen>());
       
   190    }
       
   191    template <class Gen>
       
   192    void init2(Gen& g, const ::boost::true_type&)
       
   193    {
       
   194       m_gen.seed(static_cast<unsigned long>(g == 0 ? 4357UL : g));
       
   195    }
       
   196    template <class Gen>
       
   197    void init2(Gen& g, const ::boost::false_type&)
       
   198    {
       
   199       m_gen.seed(g);
       
   200    }
       
   201    imp_type m_gen;
       
   202 };
       
   203 
       
   204 template<class IntType, IntType m, int s, int r>
       
   205 class subtract_with_carry
       
   206 {
       
   207 public:
       
   208    // types
       
   209    typedef IntType result_type;
       
   210    // parameter values
       
   211    BOOST_STATIC_CONSTANT(IntType, modulus = m);
       
   212    BOOST_STATIC_CONSTANT(int, long_lag = r);
       
   213    BOOST_STATIC_CONSTANT(int, short_lag = s);
       
   214 
       
   215    // constructors and member function
       
   216    subtract_with_carry(){}
       
   217    explicit subtract_with_carry(unsigned long value)
       
   218       : m_gen(value == 0 ? 19780503UL : value){}
       
   219    template<class Gen> subtract_with_carry(Gen& g)
       
   220    { init1(g, ::boost::is_same<Gen, subtract_with_carry<IntType, m, s, r> >()); }
       
   221    void seed(unsigned long value = 19780503ul)
       
   222    { m_gen.seed(value == 0 ? 19780503UL : value); }
       
   223    template<class Gen> void seed(Gen& g)
       
   224    { init2(g, ::boost::is_fundamental<Gen>()); }
       
   225    result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   226    { return (m_gen.min)(); }
       
   227    result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   228    { return (m_gen.max)(); }
       
   229    result_type operator()()
       
   230    { return m_gen(); }
       
   231    bool operator==(const subtract_with_carry& that)const
       
   232    { return m_gen == that.m_gen; }
       
   233    bool operator!=(const subtract_with_carry& that)const
       
   234    { return m_gen != that.m_gen; }
       
   235 
       
   236 #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
       
   237    template<class CharT, class Traits>
       
   238    friend std::basic_ostream<CharT,Traits>&
       
   239    operator<<(std::basic_ostream<CharT,Traits>& os,
       
   240             const subtract_with_carry& lcg)
       
   241    {
       
   242       return os << lcg.m_gen;
       
   243    }
       
   244 
       
   245    template<class CharT, class Traits>
       
   246    friend std::basic_istream<CharT,Traits>&
       
   247    operator>>(std::basic_istream<CharT,Traits>& is,
       
   248             subtract_with_carry& lcg)
       
   249    {
       
   250       return is >> lcg.m_gen;
       
   251    }
       
   252 #endif
       
   253 private:
       
   254    template <class Gen>
       
   255    void init1(Gen& g, const ::boost::true_type&)
       
   256    {
       
   257       m_gen = g.m_gen;
       
   258    }
       
   259    template <class Gen>
       
   260    void init1(Gen& g, const ::boost::false_type&)
       
   261    {
       
   262       init2(g, ::boost::is_fundamental<Gen>());
       
   263    }
       
   264    template <class Gen>
       
   265    void init2(Gen& g, const ::boost::true_type&)
       
   266    {
       
   267       m_gen.seed(static_cast<unsigned long>(g == 0 ? 19780503UL : g));
       
   268    }
       
   269    template <class Gen>
       
   270    void init2(Gen& g, const ::boost::false_type&)
       
   271    {
       
   272       m_gen.seed(g);
       
   273    }
       
   274    ::boost::random::subtract_with_carry<IntType, m, s, r, 0> m_gen;
       
   275 };
       
   276 
       
   277 template<class RealType, int w, int s, int r>
       
   278 class subtract_with_carry_01
       
   279 {
       
   280 public:
       
   281    // types
       
   282    typedef RealType result_type;
       
   283    // parameter values
       
   284    BOOST_STATIC_CONSTANT(int, word_size = w);
       
   285    BOOST_STATIC_CONSTANT(int, long_lag = r);
       
   286    BOOST_STATIC_CONSTANT(int, short_lag = s);
       
   287 
       
   288    // constructors and member function
       
   289    subtract_with_carry_01(){}
       
   290    explicit subtract_with_carry_01(unsigned long value)
       
   291       : m_gen(value == 0 ? 19780503UL : value){}
       
   292    template<class Gen> subtract_with_carry_01(Gen& g)
       
   293    { init1(g, ::boost::is_same<Gen, subtract_with_carry_01<RealType, w, s, r> >()); }
       
   294    void seed(unsigned long value = 19780503UL)
       
   295    { m_gen.seed(value == 0 ? 19780503UL : value); }
       
   296    template<class Gen> void seed(Gen& g)
       
   297    { init2(g, ::boost::is_fundamental<Gen>()); }
       
   298    result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   299    { return (m_gen.min)(); }
       
   300    result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   301    { return (m_gen.max)(); }
       
   302    result_type operator()()
       
   303    { return m_gen(); }
       
   304    bool operator==(const subtract_with_carry_01& that)const
       
   305    { return m_gen == that.m_gen; }
       
   306    bool operator!=(const subtract_with_carry_01& that)const
       
   307    { return m_gen != that.m_gen; }
       
   308 
       
   309 #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
       
   310    template<class CharT, class Traits>
       
   311    friend std::basic_ostream<CharT,Traits>&
       
   312    operator<<(std::basic_ostream<CharT,Traits>& os,
       
   313             const subtract_with_carry_01& lcg)
       
   314    {
       
   315       return os << lcg.m_gen;
       
   316    }
       
   317 
       
   318    template<class CharT, class Traits>
       
   319    friend std::basic_istream<CharT,Traits>&
       
   320    operator>>(std::basic_istream<CharT,Traits>& is,
       
   321             subtract_with_carry_01& lcg)
       
   322    {
       
   323       return is >> lcg.m_gen;
       
   324    }
       
   325 #endif
       
   326 private:
       
   327    template <class Gen>
       
   328    void init1(Gen& g, const ::boost::true_type&)
       
   329    {
       
   330       m_gen = g.m_gen;
       
   331    }
       
   332    template <class Gen>
       
   333    void init1(Gen& g, const ::boost::false_type&)
       
   334    {
       
   335       init2(g, ::boost::is_fundamental<Gen>());
       
   336    }
       
   337    template <class Gen>
       
   338    void init2(Gen& g, const ::boost::true_type&)
       
   339    {
       
   340       m_gen.seed(static_cast<unsigned long>(g == 0 ? 19780503UL : g));
       
   341    }
       
   342    template <class Gen>
       
   343    void init2(Gen& g, const ::boost::false_type&)
       
   344    {
       
   345       //typedef typename Gen::result_type gen_rt;
       
   346       boost::tr1_details::functor2iterator<Gen, unsigned long> f1(g), f2;
       
   347       m_gen.seed(f1, f2);
       
   348    }
       
   349    ::boost::random::subtract_with_carry_01<RealType, w, s, r, 0> m_gen;
       
   350 };
       
   351 
       
   352 using ::boost::random::discard_block;
       
   353 
       
   354 template<class UniformRandomNumberGenerator1, int s1, class UniformRandomNumberGenerator2, int s2>
       
   355 class xor_combine
       
   356 {
       
   357 public:
       
   358    // types
       
   359    typedef UniformRandomNumberGenerator1 base1_type;
       
   360    typedef UniformRandomNumberGenerator2 base2_type;
       
   361    typedef unsigned long result_type;
       
   362    // parameter values
       
   363    BOOST_STATIC_CONSTANT(int, shift1 = s1);
       
   364    BOOST_STATIC_CONSTANT(int, shift2 = s2);
       
   365    // constructors and member function
       
   366    xor_combine(){ init_minmax(); }
       
   367    xor_combine(const base1_type & rng1, const base2_type & rng2)
       
   368       : m_b1(rng1), m_b2(rng2) { init_minmax(); }
       
   369    xor_combine(unsigned long s)
       
   370       : m_b1(s), m_b2(s+1) { init_minmax(); }
       
   371    template<class Gen> xor_combine(Gen& g)
       
   372    { 
       
   373       init_minmax(); 
       
   374       init1(g, ::boost::is_same<Gen, xor_combine<UniformRandomNumberGenerator1, s1, UniformRandomNumberGenerator2, s2> >());
       
   375    }
       
   376    void seed()
       
   377    {
       
   378       m_b1.seed();
       
   379       m_b2.seed();
       
   380    }
       
   381    void seed(unsigned long s)
       
   382    {
       
   383       m_b1.seed(s);
       
   384       m_b2.seed(s+1);
       
   385    }
       
   386    template<class Gen> void seed(Gen& g)
       
   387    {
       
   388       init2(g, ::boost::is_fundamental<Gen>());
       
   389    }
       
   390 
       
   391    const base1_type& base1() const
       
   392    { return m_b1; }
       
   393    const base2_type& base2() const
       
   394    { return m_b2; }
       
   395    result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   396    { return m_min; }
       
   397    result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
       
   398    { return m_max; }
       
   399    result_type operator()()
       
   400    { return (m_b1() << s1) ^ (m_b2() << s2); }
       
   401 
       
   402    bool operator == (const xor_combine& that)const
       
   403    { return (m_b1 == that.m_b1) && (m_b2 == that.m_b2); }
       
   404    bool operator != (const xor_combine& that)const
       
   405    { return !(*this == that); }
       
   406 
       
   407 #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
       
   408    template<class CharT, class Traits>
       
   409    friend std::basic_ostream<CharT,Traits>&
       
   410    operator<<(std::basic_ostream<CharT,Traits>& os,
       
   411             const xor_combine& lcg)
       
   412    {
       
   413       return os << lcg.m_b1 << " " << lcg.m_b2;
       
   414    }
       
   415 
       
   416    template<class CharT, class Traits>
       
   417    friend std::basic_istream<CharT,Traits>&
       
   418    operator>>(std::basic_istream<CharT,Traits>& is,
       
   419             xor_combine& lcg)
       
   420    {
       
   421       return is >> lcg.m_b1 >> lcg.m_b2;
       
   422    }
       
   423 #endif
       
   424 
       
   425 private:
       
   426    void init_minmax();
       
   427    base1_type m_b1;
       
   428    base2_type m_b2;
       
   429    result_type m_min;
       
   430    result_type m_max;
       
   431 
       
   432    template <class Gen>
       
   433    void init1(Gen& g, const ::boost::true_type&)
       
   434    {
       
   435       m_b1 = g.m_b1;
       
   436       m_b2 = g.m_b2;
       
   437    }
       
   438    template <class Gen>
       
   439    void init1(Gen& g, const ::boost::false_type&)
       
   440    {
       
   441       init2(g, ::boost::is_fundamental<Gen>());
       
   442    }
       
   443    template <class Gen>
       
   444    void init2(Gen& g, const ::boost::true_type&)
       
   445    {
       
   446       m_b1.seed(static_cast<unsigned long>(g));
       
   447       m_b2.seed(static_cast<unsigned long>(g));
       
   448    }
       
   449    template <class Gen>
       
   450    void init2(Gen& g, const ::boost::false_type&)
       
   451    {
       
   452       m_b1.seed(g);
       
   453       m_b2.seed(g);
       
   454    }
       
   455 };
       
   456 
       
   457 template<class UniformRandomNumberGenerator1, int s1, class UniformRandomNumberGenerator2, int s2>
       
   458 void xor_combine<UniformRandomNumberGenerator1, s1, UniformRandomNumberGenerator2, s2>::init_minmax()
       
   459 {
       
   460    //
       
   461    // The following code is based on that given in "Hacker's Delight"
       
   462    // by Henry S. Warren, (Addison-Wesley, 2003), and at 
       
   463    // http://www.hackersdelight.org/index.htm.
       
   464    // Used here by permission.
       
   465    //
       
   466    // calculation of minimum value:
       
   467    //
       
   468    result_type a = (m_b1.min)() << s1;
       
   469    result_type b = (m_b1.max)() << s1;
       
   470    result_type c = (m_b2.min)() << s2;
       
   471    result_type d = (m_b2.max)() << s2;
       
   472    result_type m, temp;
       
   473 
       
   474    m = 0x1uL << ((sizeof(result_type) * CHAR_BIT) - 1);
       
   475    while (m != 0) {
       
   476       if (~a & c & m) {
       
   477          temp = (a | m) & (static_cast<result_type>(0u) - m);
       
   478          if (temp <= b) a = temp;
       
   479       }
       
   480       else if (a & ~c & m) {
       
   481          temp = (c | m) & (static_cast<result_type>(0u) - m);
       
   482          if (temp <= d) c = temp;
       
   483       }
       
   484       m >>= 1;
       
   485    }
       
   486    m_min = a ^ c;
       
   487 
       
   488    //
       
   489    // calculation of maximum value:
       
   490    //
       
   491    if((((std::numeric_limits<result_type>::max)() >> s1) < (m_b1.max)())
       
   492       || ((((std::numeric_limits<result_type>::max)()) >> s2) < (m_b2.max)()))
       
   493    {
       
   494       m_max = (std::numeric_limits<result_type>::max)();
       
   495       return;
       
   496    }
       
   497    a = (m_b1.min)() << s1;
       
   498    b = (m_b1.max)() << s1;
       
   499    c = (m_b2.min)() << s2;
       
   500    d = (m_b2.max)() << s2;
       
   501 
       
   502    m = 0x1uL << ((sizeof(result_type) * CHAR_BIT) - 1);
       
   503 
       
   504    while (m != 0) {
       
   505       if (b & d & m) {
       
   506          temp = (b - m) | (m - 1);
       
   507          if (temp >= a) b = temp;
       
   508          else {
       
   509             temp = (d - m) | (m - 1);
       
   510             if (temp >= c) d = temp;
       
   511          }
       
   512       }
       
   513       m = m >> 1;
       
   514    }
       
   515    m_max = b ^ d;
       
   516 }
       
   517 
       
   518 typedef linear_congruential< ::boost::int32_t, 16807, 0, 2147483647> minstd_rand0;
       
   519 typedef linear_congruential< ::boost::int32_t, 48271, 0, 2147483647> minstd_rand;
       
   520 typedef mersenne_twister< ::boost::uint32_t, 32,624,397,31,0x9908b0df,11,7,0x9d2c5680,15,0xefc60000,18> mt19937;
       
   521 typedef subtract_with_carry_01<float, 24, 10, 24> ranlux_base_01;
       
   522 typedef subtract_with_carry_01<double, 48, 10, 24> ranlux64_base_01;
       
   523 typedef discard_block<subtract_with_carry< ::boost::int32_t, (1<<24), 10, 24>, 223, 24> ranlux3;
       
   524 typedef discard_block<subtract_with_carry< ::boost::int32_t, (1<<24), 10, 24>, 389, 24> ranlux4;
       
   525 typedef discard_block<subtract_with_carry_01<float, 24, 10, 24>, 223, 24> ranlux3_01;
       
   526 typedef discard_block<subtract_with_carry_01<float, 24, 10, 24>, 389, 24> ranlux4_01;
       
   527 
       
   528 #ifndef __SUNPRO_CC
       
   529 using ::boost::random_device;
       
   530 #endif
       
   531 using ::boost::uniform_int;
       
   532 
       
   533 class bernoulli_distribution
       
   534 {
       
   535 public:
       
   536    // types
       
   537    typedef int input_type;
       
   538    typedef bool result_type;
       
   539    // constructors and member function
       
   540    explicit bernoulli_distribution(double p = 0.5)
       
   541       : m_dist(p){}
       
   542    double p() const
       
   543    { return m_dist.p(); }
       
   544    void reset()
       
   545    { m_dist.reset(); }
       
   546    template<class UniformRandomNumberGenerator>
       
   547    result_type operator()(UniformRandomNumberGenerator& urng)
       
   548    {
       
   549       return m_dist(urng);
       
   550    }
       
   551 #if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
       
   552    template<class CharT, class Traits>
       
   553    friend std::basic_ostream<CharT,Traits>&
       
   554    operator<<(std::basic_ostream<CharT,Traits>& os,
       
   555             const bernoulli_distribution& lcg)
       
   556    {
       
   557       return os << lcg.m_dist;
       
   558    }
       
   559 
       
   560    template<class CharT, class Traits>
       
   561    friend std::basic_istream<CharT,Traits>&
       
   562    operator>>(std::basic_istream<CharT,Traits>& is,
       
   563             bernoulli_distribution& lcg)
       
   564    {
       
   565       return is >> lcg.m_dist;
       
   566    }
       
   567 #endif
       
   568 
       
   569 private:
       
   570    ::boost::bernoulli_distribution<double> m_dist;
       
   571 };
       
   572 //using ::boost::bernoulli_distribution;
       
   573 using ::boost::geometric_distribution;
       
   574 using ::boost::poisson_distribution;
       
   575 using ::boost::binomial_distribution;
       
   576 using ::boost::uniform_real;
       
   577 using ::boost::exponential_distribution;
       
   578 using ::boost::normal_distribution;
       
   579 using ::boost::gamma_distribution;
       
   580 
       
   581 } }
       
   582 
       
   583 #endif
       
   584 
       
   585 #endif
       
   586