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 检查的验证值。
![]() |
注意 |
---|---|
当前实现使用欧几里得算法来计算乘法逆。因此,逆向生成器比其他生成器慢大约 10-20 倍(参见“性能”部分)。然而,论文中只提到了 3 倍的减速,所以欧几里得算法可能不是计算乘法逆的最优方法。 |
inversive_congruential_engine
公有成员函数inversive_congruential_engine();
构造一个 inversive_congruential_engine
,并使用默认种子进行初始化。
explicit inversive_congruential_engine(IntType x0);
构造一个 inversive_congruential_engine
,并使用 x0
进行初始化。
template<typename SeedSeq> explicit inversive_congruential_engine(SeedSeq & seq);
构造一个 inversive_congruential_engine
,并使用调用 seq.generate()
产生的种子值进行初始化。
template<typename It> inversive_congruential_engine(It & first, It last);
构造一个 inversive_congruential_engine
,使用迭代器范围 [first, last) 中的值进行初始化,并将 first 指向最后一个使用的元素的下一个元素。如果元素不足,则抛出 std::invalid_argument
。
first 和 last 必须是输入迭代器。
void seed();
调用 seed(default_seed)
void seed(IntType x0);
如果 c mod m 为零且 x0 mod m 为零,则将生成器的当前值更改为 1。否则,将其更改为 x0 mod m。如果 c 为零,则范围 [1,m) 中的不同种子将使生成器处于不同的状态。如果 c 不为零,则范围为 [0,m)。
template<typename SeedSeq> void seed(SeedSeq & seq);
使用 SeedSeq 中的值初始化 inversive_congruential_engine
。
template<typename It> void seed(It & first, It last);
使用迭代器范围 [first, last) 中的值初始化 inversive_congruential_engine
,并将 first
指向最后一个使用的元素的下一个元素。如果元素不足,则抛出 std::invalid_argument
。
first
和 last
必须是输入迭代器。
IntType operator()();
返回生成器的下一个输出。
template<typename Iter> void generate(Iter first, Iter last);
用随机值填充一个范围
void discard(boost::uintmax_t z);
将生成器的状态向前推进 z
。
inversive_congruential_engine
友元函数template<typename CharT, typename Traits> std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > & os, const inversive_congruential_engine & x);
将生成器的文本表示写入 std::ostream
。
template<typename CharT, typename Traits> std::basic_istream< CharT, Traits > & operator>>(std::basic_istream< CharT, Traits > & is, const inversive_congruential_engine & x);
从 std::istream
读取生成器的文本表示。
bool operator==(const inversive_congruential_engine & x, const inversive_congruential_engine & y);
如果两个生成器将产生相同的输出序列,则返回 true。
bool operator!=(const inversive_congruential_engine & lhs, const inversive_congruential_engine & rhs);
如果两个生成器将产生不同的输出序列,则返回 true。