C++11 多随机数引擎适配器
C++11 multiple random number engine adaptors
是否可以同时使用多个适配器在 C++11 中由 STL 提供的随机引擎?
例如,将 Mersenne Twister 引擎与 Discard Block engine adaptor (from each block of size P generated by the base engine, the adaptor keeps only R numbers, discarding the rest) and the Shuffle Order engine adaptor 一起使用(以不同的顺序提供随机数引擎的输出)。
示例引擎适配器使用不知情的人:
//some code here to create a valid seed sequence
mt19937 eng(mySeedSequence);
discard_block_engine<mt19937,11,5> discardWrapper(eng);
shuffle_order_engine<mt19937,50> shuffleWrapper(eng);
for (int i=0; i<100; ++i) {
//for every 5 calls to "discardWrapper()", the twister engine
//advances by 11 states (6 random numbers are thrown away)
cout << discardWrapper() << endl;
}
for (int i=0; i<100; ++i) {
//essentially 50 random numbers are generated from the Twister
//engine and put into a maintained table, one is then picked from
//the table, not necessarily in the order you would expect if you
//knew the internal state of the engine
cout << shuffleWrapper() << endl;
}
是的,你可以做到。您只需要根据另一种定义一种适配器类型:
typedef std::discard_block_engine<std::mt19937, 11, 5> discard_engine_t;
typedef std::shuffle_order_engine<discard_engine_t, 50> shuffle_engine_t;
std::mt19937 mt_eng;
discard_engine_t discard_eng(mt_eng);
shuffle_engine_t shuffle_eng(discard_eng);
是否可以同时使用多个适配器在 C++11 中由 STL 提供的随机引擎?
例如,将 Mersenne Twister 引擎与 Discard Block engine adaptor (from each block of size P generated by the base engine, the adaptor keeps only R numbers, discarding the rest) and the Shuffle Order engine adaptor 一起使用(以不同的顺序提供随机数引擎的输出)。
示例引擎适配器使用不知情的人:
//some code here to create a valid seed sequence
mt19937 eng(mySeedSequence);
discard_block_engine<mt19937,11,5> discardWrapper(eng);
shuffle_order_engine<mt19937,50> shuffleWrapper(eng);
for (int i=0; i<100; ++i) {
//for every 5 calls to "discardWrapper()", the twister engine
//advances by 11 states (6 random numbers are thrown away)
cout << discardWrapper() << endl;
}
for (int i=0; i<100; ++i) {
//essentially 50 random numbers are generated from the Twister
//engine and put into a maintained table, one is then picked from
//the table, not necessarily in the order you would expect if you
//knew the internal state of the engine
cout << shuffleWrapper() << endl;
}
是的,你可以做到。您只需要根据另一种定义一种适配器类型:
typedef std::discard_block_engine<std::mt19937, 11, 5> discard_engine_t;
typedef std::shuffle_order_engine<discard_engine_t, 50> shuffle_engine_t;
std::mt19937 mt_eng;
discard_engine_t discard_eng(mt_eng);
shuffle_engine_t shuffle_eng(discard_eng);