Boost C++ 库

……这是世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

类模板 inversive_congruential_engine - Boost C++ 函数库
PrevUpHomeNext

类模板 inversive_congruential_engine

boost::random::inversive_congruential_engine

提要

// In header: <boost/random/inversive_congruential.hpp>

template<typename IntType, IntType a, IntType b, IntType p> 
class inversive_congruential_engine {
public:
  // types
  typedef IntType result_type;

  // public static functions
  static result_type min();
  static result_type max();

  // public member functions
  inversive_congruential_engine();
  explicit inversive_congruential_engine(IntType);
  template<typename SeedSeq> explicit inversive_congruential_engine(SeedSeq &);
  template<typename It> inversive_congruential_engine(It &, It);
  void seed();
  void seed(IntType);
  template<typename SeedSeq> void seed(SeedSeq &);
  template<typename It> void seed(It &, It);
  IntType operator()();
  template<typename Iter> void generate(Iter, Iter);
  void discard(boost::uintmax_t);

  // friend functions
  template<typename CharT, typename Traits> 
    std::basic_ostream< CharT, Traits > & 
    operator<<(std::basic_ostream< CharT, Traits > &, 
               const inversive_congruential_engine &);
  template<typename CharT, typename Traits> 
    std::basic_istream< CharT, Traits > & 
    operator>>(std::basic_istream< CharT, Traits > &, 
               const inversive_congruential_engine &);
  bool operator==(const inversive_congruential_engine &, 
                  const inversive_congruential_engine &);
  bool operator!=(const inversive_congruential_engine &, 
                  const inversive_congruential_engine &);

  // public data members
  static const bool has_fixed_range;
  static const result_type multiplier;
  static const result_type increment;
  static const result_type modulus;
  static const IntType default_seed;
};

描述

类模板 inversive_congruential_engine 的实例化模型了一个伪随机数生成器。它使用了其中描述的逆向同余算法 (ICG)

"Inversive pseudorandom number generators: concepts, results and links", Peter Hellekalek, In: "Proceedings of the 1995 Winter Simulation Conference", C. Alexopoulos, K. Kang, W.R. Lilegdon, and D. Goldsman (editors), 1995, pp. 255-262. ftp://random.mat.sbg.ac.at/pub/data/wsc95.ps

输出序列由 x(n+1) = (a*inv(x(n)) - b) (mod p) 定义,其中 x(0)、a、b 和素数 p 是生成器的参数。表达式 inv(k) 表示 k 在模 p 的整数域中的乘法逆,其中 inv(0) := 0。

模板参数 IntType 应表示一个足够大的有符号整数类型,可以容纳 p;a、b 和 p 是生成器的参数。模板参数 val 是 validation 检查的验证值。

[Note] 注意

当前实现使用欧几里得算法来计算乘法逆。因此,逆向生成器比其他生成器慢大约 10-20 倍(参见“性能”部分)。然而,论文中只提到了 3 倍的减速,所以欧几里得算法可能不是计算乘法逆的最优方法。

inversive_congruential_engine 公有静态函数

  1. static result_type min();
  2. static result_type max();

inversive_congruential_engine 公有成员函数

  1. inversive_congruential_engine();

    构造一个 inversive_congruential_engine,并使用默认种子进行初始化。

  2. explicit inversive_congruential_engine(IntType x0);

    构造一个 inversive_congruential_engine,并使用 x0 进行初始化。

  3. template<typename SeedSeq> 
      explicit inversive_congruential_engine(SeedSeq & seq);

    构造一个 inversive_congruential_engine,并使用调用 seq.generate() 产生的种子值进行初始化。

  4. template<typename It> inversive_congruential_engine(It & first, It last);

    构造一个 inversive_congruential_engine,使用迭代器范围 [first, last) 中的值进行初始化,并将 first 指向最后一个使用的元素的下一个元素。如果元素不足,则抛出 std::invalid_argument

    first 和 last 必须是输入迭代器。

  5. void seed();

    调用 seed(default_seed)

  6. void seed(IntType x0);

    如果 c mod m 为零且 x0 mod m 为零,则将生成器的当前值更改为 1。否则,将其更改为 x0 mod m。如果 c 为零,则范围 [1,m) 中的不同种子将使生成器处于不同的状态。如果 c 不为零,则范围为 [0,m)。

  7. template<typename SeedSeq> void seed(SeedSeq & seq);

    使用 SeedSeq 中的值初始化 inversive_congruential_engine

  8. template<typename It> void seed(It & first, It last);

    使用迭代器范围 [first, last) 中的值初始化 inversive_congruential_engine,并将 first 指向最后一个使用的元素的下一个元素。如果元素不足,则抛出 std::invalid_argument

    firstlast 必须是输入迭代器。

  9. IntType operator()();

    返回生成器的下一个输出。

  10. template<typename Iter> void generate(Iter first, Iter last);

    用随机值填充一个范围

  11. void discard(boost::uintmax_t z);

    将生成器的状态向前推进 z

inversive_congruential_engine 友元函数

  1. template<typename CharT, typename Traits> 
      std::basic_ostream< CharT, Traits > & 
      operator<<(std::basic_ostream< CharT, Traits > & os, 
                 const inversive_congruential_engine & x);

    将生成器的文本表示写入 std::ostream

  2. template<typename CharT, typename Traits> 
      std::basic_istream< CharT, Traits > & 
      operator>>(std::basic_istream< CharT, Traits > & is, 
                 const inversive_congruential_engine & x);

    std::istream 读取生成器的文本表示。

  3. bool operator==(const inversive_congruential_engine & x, 
                    const inversive_congruential_engine & y);

    如果两个生成器将产生相同的输出序列,则返回 true。

  4. bool operator!=(const inversive_congruential_engine & lhs, 
                    const inversive_congruential_engine & rhs);

    如果两个生成器将产生不同的输出序列,则返回 true。


PrevUpHomeNext